HTTP Sessions - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

📦 Proyecto: ejemplo-sesiones — ⬇️ Descargar · ☁️ Abrir en Codespace


El problema: HTTP no tiene memoria

Cada vez que el navegador hace una petición al servidor, HTTP la trata como si fuera la primera. El servidor no recuerda quién eres.

Petición 1: GET /tienda  → servidor responde
Petición 2: POST /agregar → servidor NO sabe si es el mismo usuario

Esto es un problema cuando necesitas recordar cosas entre peticiones, por ejemplo:

  • El usuario que inició sesión
  • Los productos en un carrito
  • Las preferencias del usuario

La solución: HTTP Sessions. El servidor crea un objeto en memoria asociado a ese usuario, y lo identifica con una cookie llamada JSESSIONID.

Navegador                        Servidor
   |                                |
   |-- GET /login ----------------> |
   |<-- Set-Cookie: JSESSIONID=xyz -|  ← servidor crea sesión
   |                                |
   |-- POST /agregar (JSESSIONID=xyz) -->  ← servidor reconoce al usuario
   |<-- respuesta ------------------|

Crear y acceder a la sesión

// En cualquier Servlet:
HttpSession sesion = request.getSession();

getSession() hace dos cosas:

  • Si el usuario ya tiene sesión activa → la devuelve
  • Si no tiene → crea una nueva

Guardar datos en la sesión

// setAttribute(nombre, valor)
sesion.setAttribute("usuario", "Ana García");
sesion.setAttribute("rol", "admin");
sesion.setAttribute("carrito", new ArrayList<>());

Leer datos de la sesión

String usuario = (String) sesion.getAttribute("usuario");

⚠️ getAttribute() devuelve Object — siempre hay que hacer cast al tipo correcto.

Eliminar datos o destruir la sesión

// Eliminar un atributo específico
sesion.removeAttribute("usuario");

// Destruir toda la sesión (logout)
sesion.invalidate();

Ejemplo completo: Login básico

1. Formulario de login (login.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
  <form action="login" method="post">
    <input type="text"     name="usuario"    placeholder="Usuario">
    <input type="password" name="contrasena" placeholder="Contraseña">
    <button type="submit">Ingresar</button>
  </form>
</body>
</html>

2. Servlet que procesa el login (LoginServlet.java)

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String usuario    = request.getParameter("usuario");
        String contrasena = request.getParameter("contrasena");

        // Validación simple (en producción usarías la BD)
        if ("admin".equals(usuario) && "1234".equals(contrasena)) {

            // ✅ Login exitoso: guardar usuario en sesión
            HttpSession sesion = request.getSession();
            sesion.setAttribute("usuarioLogueado", usuario);

            response.sendRedirect(request.getContextPath() + "/inicio");

        } else {
            // ❌ Credenciales incorrectas
            response.sendRedirect(request.getContextPath() + "/login.jsp?error=1");
        }
    }
}

3. Página de inicio protegida (InicioServlet.java)

@WebServlet("/inicio")
public class InicioServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        HttpSession sesion = request.getSession(false); // false = no crear si no existe

        if (sesion == null || sesion.getAttribute("usuarioLogueado") == null) {
            // No hay sesión activa → redirigir al login
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return;
        }

        // Hay sesión activa → mostrar página
        String usuario = (String) sesion.getAttribute("usuarioLogueado");
        request.setAttribute("usuario", usuario);
        request.getRequestDispatcher("/WEB-INF/vistas/inicio.jsp").forward(request, response);
    }
}

4. Vista de inicio (inicio.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
  <h1>Bienvenido, ${usuario}!</h1>
  <a href="${pageContext.request.contextPath}/logout">Cerrar sesión</a>
</body>
</html>

5. Servlet de logout

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        HttpSession sesion = request.getSession(false);
        if (sesion != null) {
            sesion.invalidate(); // destruye la sesión y todos sus datos
        }
        response.sendRedirect(request.getContextPath() + "/login.jsp");
    }
}

getSession() vs getSession(false)

Método Comportamiento
request.getSession() Si no existe sesión, crea una nueva
request.getSession(true) Igual que el anterior
request.getSession(false) Si no existe sesión, devuelve null (no crea)

Usar getSession(false) en páginas protegidas es la forma correcta de verificar si el usuario está logueado.


Proteger todas las páginas: el patrón "guardia"

En lugar de repetir la verificación en cada Servlet, se puede centralizarla en un método auxiliar o en un filtro.

Método auxiliar (enfoque simple):

// En un Servlet protegido
private boolean estaLogueado(HttpServletRequest request, HttpServletResponse response)
        throws IOException {

    HttpSession sesion = request.getSession(false);
    if (sesion == null || sesion.getAttribute("usuarioLogueado") == null) {
        response.sendRedirect(request.getContextPath() + "/login.jsp");
        return false;
    }
    return true;
}

// Uso en doGet / doPost:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    if (!estaLogueado(request, response)) {
        return; // ← sale si no está logueado
    }

    // ... código normal del Servlet
}

Tiempo de vida de la sesión

La sesión expira si el usuario no hace peticiones durante un tiempo. El valor por defecto en Tomcat es 30 minutos.

Se puede configurar en web.xml:

<session-config>
    <session-timeout>15</session-timeout> <!-- minutos -->
</session-config>

O en código:

sesion.setMaxInactiveInterval(900); // 900 segundos = 15 minutos

⚠️ Buenas prácticas

✅ Hacer ❌ No hacer
Usar getSession(false) para verificar Guardar contraseñas en la sesión
Llamar invalidate() en el logout Guardar objetos grandes en sesión
Verificar sesión al inicio de cada Servlet protegido Confiar en datos de sesión sin validar
Tiempo de expiración razonable Dejar la sesión abierta indefinidamente

📋 Palabras clave

HttpSession · getSession() · setAttribute · getAttribute · invalidate · JSESSIONID · sesión HTTP · login · logout · autenticación · estado del usuario · getSession(false)


🧠 Autoevaluación — HTTP Sessions


Programación Avanzada · Prof. Elizabeth Izquierdo


← Mi primer formulario · 🏠 Inicio · ¿Qué es el MVC? →

⚠️ **GitHub.com Fallback** ⚠️