HTTP Sessions - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki
📦 Proyecto:
ejemplo-sesiones— ⬇️ Descargar · ☁️ Abrir en Codespace
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 ------------------|
// 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
// setAttribute(nombre, valor)
sesion.setAttribute("usuario", "Ana García");
sesion.setAttribute("rol", "admin");
sesion.setAttribute("carrito", new ArrayList<>());String usuario = (String) sesion.getAttribute("usuario");getAttribute() devuelve Object — siempre hay que hacer cast al tipo correcto.
// Eliminar un atributo específico
sesion.removeAttribute("usuario");
// Destruir toda la sesión (logout)
sesion.invalidate();<%@ 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>@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");
}
}
}@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);
}
}<%@ 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>@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");
}
}| 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.
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
}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| ✅ 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 |
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
