HTTP es un protocolo sin estado. Para mantener información entre peticiones (usuario autenticado, carrito de compra, preferencias) se usan sesiones.
HttpSession
// Obtener sesión (crea una nueva si no existe)
HttpSession sesion = req.getSession();
// Obtener sesión existente (null si no existe)
HttpSession sesion = req.getSession(false);
// Guardar atributo
sesion.setAttribute("usuario", "ana.garcia");
sesion.setAttribute("rol", "ADMIN");
// Leer atributo
String usuario = (String) sesion.getAttribute("usuario");
// Eliminar atributo
sesion.removeAttribute("carrito");
// Invalidar la sesión completa (logout)
sesion.invalidate();
// Configurar timeout (segundos; -1 = nunca expira)
sesion.setMaxInactiveInterval(30 * 60); // 30 minutos
Proteger recursos con un filtro de autenticación
@WebFilter("/admin/*") // aplica a todas las URLs bajo /admin/
public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpSession sesion = request.getSession(false);
boolean autenticado = sesion != null && sesion.getAttribute("usuario") != null;
if (autenticado) {
chain.doFilter(req, resp); // continúa con la petición
} else {
response.sendRedirect(request.getContextPath() + "/login");
}
}
}
Cookies
// Crear cookie
Cookie cookie = new Cookie("idioma", "es");
cookie.setMaxAge(30 * 24 * 60 * 60); // 30 días en segundos
cookie.setPath("/");
cookie.setHttpOnly(true); // no accesible desde JavaScript
cookie.setSecure(true); // solo HTTPS
resp.addCookie(cookie);
// Leer cookies
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("idioma".equals(c.getName())) {
String idioma = c.getValue();
}
}
}
// Eliminar cookie (setMaxAge a 0)
Cookie borrar = new Cookie("idioma", "");
borrar.setMaxAge(0);
borrar.setPath("/");
resp.addCookie(borrar);
Procesar formularios POST
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
String usuario = req.getParameter("usuario");
String password = req.getParameter("password");
// Validación básica
if (usuario == null || usuario.isBlank() || password == null) {
req.setAttribute("error", "Credenciales inválidas");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
return;
}
// Verificar credenciales (aquí iría la llamada al servicio/BD)
if (autenticar(usuario, password)) {
HttpSession sesion = req.getSession(true);
sesion.setAttribute("usuario", usuario);
resp.sendRedirect(req.getContextPath() + "/panel"); // Post-Redirect-Get
} else {
req.setAttribute("error", "Usuario o contraseña incorrectos");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
private boolean autenticar(String u, String p) {
return "admin".equals(u) && "secreto".equals(p); // ejemplo simplificado
}
}
