Repaso de Session en JavaWeb

1. Introducción a Session

En el desarrollo web, el servidor puede crear un objeto de sesión (objeto session) para el navegador de cada usuario. Es importante destacar que, por defecto, un navegador utiliza exclusivamente un objeto de sesión. Por lo tanto, cuando es necesario preservar datos del usuario, el programa del servidor puede almacenar dichos datos en la sesión exclusiva del navegador del usuario. Cuando el usuario accede a otras funcionalidades del programa a través del mismo navegador, estas pueden recuperar los datos del usuario desde la sesión y utilizarlos para brindarle servicio.

2. Diferencias principales entre Session y Cookie

  • Cookie escribe los datos del usuario en el navegador del usuario.
  • La tecnología Session escribe los datos del usuario en la sesión exclusiva del usuario.
  • El objeto Session es creado por el servidor; el desarrollador puede obtener el objeto session llamando al método getSession del objeto request.

3. Principio de implementación de Session

3.1. Cómo el servidor asigna una sesión a un navegador de usuario

Una vez que el servidor crea una sesión, envía el ID de la sesión de vuelta al cliente en forma de cookie. De esta manera, mientras el navegador del cliente permanezca abierto, cada vez que acceda al servidor, llevará consigo el ID de la sesión. El servidor, al detectar que el navegador del cliente trae el ID, utilizará la sesión correspondiente en memoria para atenderlo. Esto se puede demostrar con el siguiente código:

package com.ejemplo.session;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class EjemploSesion1 extends HttpServlet {

    public void doGet(HttpServletRequest peticion, HttpServletResponse respuesta)
            throws ServletException, IOException {

        respuesta.setCharacterEncoding("UTF-8");
        respuesta.setContentType("text/html;charset=UTF-8");

        // Obtener la sesión usando el método getSession(); si no existe, se crea una nueva
        HttpSession sesion = peticion.getSession();

        // Almacenar un dato en la sesión
        sesion.setAttribute("info", "EjemploSesion");

        // Obtener el ID de la sesión
        String idSesion = sesion.getId();

        // Verificar si la sesión es nueva
        if (sesion.isNew()) {
            respuesta.getWriter().print("Sesión creada exitosamente, ID: " + idSesion);
        } else {
            respuesta.getWriter().print("La sesión ya existía en el servidor, ID: " + idSesion);
        }
    }

    public void doPost(HttpServletRequest peticion, HttpServletResponse respuesta)
            throws ServletException, IOException {
        doGet(peticion, respuesta);
    }
}

Internamente, el método request.getSession() realiza lo siugiente al crear una nueva sesión:

// Obtener el ID de la sesión
String idSesion = sesion.getId();
// Almacenar el ID de la sesión en una cookie llamada JSESSIONID
Cookie cookieSesion = new Cookie("JSESSIONID", idSesion);
// Configurar la ruta efectiva de la cookie
cookieSesion.setPath(peticion.getContextPath());
respuesta.addCookie(cookieSesion);

4. Manejo de Session cuando el navegador deshabilita las cookies

Generalmente, se utiliza la reescritura de URL para solucionar este problema.

  • response.encodeRedirectURL(java.lang.String url): se usa para reescribir la URL después del método sendRedirect.
  • response.encodeURL(java.lang.String url): se emplea para reescribir las URLs de formularios y enlaces.

Además, response.encodeRedirectURL() y response.encodeURL() son métodos inteligentes: si detectan que el navegador no ha deshabilitado las cookies, omiten la reescritura de la URL.

5. Ciclo de vida del objeto Session: creación y destrucción

La primera vez que se invoca request.getSession() en el programa, se crea una nueva sesión. Se puede usar el método isNew() para determinar si la sesión es nueva. Por defecto, si la sesión no se utiliza durante 30 minutos, el servidor la destruye automáticamente. Es posible configurar manualmente el tiempo de expiración de la sesión en el archivo web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!-- Configurar el tiempo de validez de la sesión: en minutos -->
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

</web-app>

Si se desea destruir la sesión manualmente dentro del programa, se puede llamar al método session.invalidate():

HttpSession sesion = peticion.getSession();
// Llamar manualmente a invalidate() para destruir la sesión
sesion.invalidate();

Etiquetas: servlet HttpSession Cookie JSESSIONID URL Rewriting

Publicado el 7-14 18:10