Servlets y JSP: tutorial Jakarta EE 10 y Java 21

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
    }
}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR