4.1 Introducción a HttpSession

Si varias solicitudes provienen del mismo cliente, dicen que se ha establecido una sesión entre el cliente y el servidor. Para controlar este proceso, el contenedor tiene un objeto HttpSession especial.

Cuando un cliente realiza una solicitud a un servlet, el contenedor de servlet verifica si el parámetro ID de sesión está presente en la solicitud. Si no existe dicho parámetro (por ejemplo, el cliente se está comunicando con el servidor por primera vez), el contenedor de servlet crea un nuevo objeto HttpSession y también le asigna una ID única.

El objeto de sesión se almacena en el servidor y la ID se envía en la respuesta al cliente y, de forma predeterminada, se almacena en el cliente en una cookie. Luego, cuando llega una nueva solicitud del mismo cliente, el contenedor de servlet recupera la ID de ella y, mediante esa ID, encuentra el objeto HttpSession correcto en el servidor.

Puede obtener el objeto de sesión de una solicitud (un objeto HttpServletRequest), en el que debe llamar al método getSession(). Devuelve un objeto HttpSession.

¿Por qué es necesaria una sesión? Puede almacenar información sobre el cliente entre llamadas. Tiene algo así como un HashMap en su interior, en el que puedes almacenar objetos por claves. Y algunos métodos para esto:

Métodos Descripción
1 setAttribute(String name, Object o) Agrega un objeto a la sesión.
2 getAttribute(String name) Obtiene un objeto de la sesión.
3 removeAttribute(String name) Elimina un objeto de la sesión.

Escribamos un servlet que resuma todos los números que se le pasan desde diferentes solicitudes:

public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Get the "sum" attribute from the session
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Handling the situation when the session does not yet have such an attribute
        if (sum == null)
            sum = 0;

         // Get the "n" parameter from the request
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);

         // Write the "sum" attribute to the session
        session.setAttribute("sum", sum);

        // Print the HTML as a response to the browser
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head> <title> CalculatorServlet </title> </head>");
        out.println("<body>");
        out.println("<h1> Sum == " + sum + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4.2 Más sobre HttpSession

¿Hay algo más que no hayamos dicho sobre el objeto HttpSession?

Primero, es el nombre J SESSION ID. Es debajo de él que la identificación de la sesión se almacena en las cookies. Como puede ver, es bastante fácil de recordar: J+SESSION+ID.

En segundo lugar, la sesión tiene algunos métodos más útiles:

Métodos Descripción
1 getAttributeNames() Devuelve una lista de todas las claves almacenadas en la sesión.
2 getId() Devuelve el ID de sesión (cadena)
3 isNew() Devuelve verdadero si el objeto de sesión se creó en la solicitud actual
4 setMaxInactiveInterval(int seconds) Establece el intervalo de inactividad de la sesión en segundos
5 invalidate() Elimina todos los objetos de la sesión.

Aquí todos los métodos son obvios, pero setMaxInactiveInterval()hablaremos un poco más.

Si el servidor almacena decenas de miles de sesiones, incluidos los datos de los clientes que lo visitaron el mes pasado, simplemente se quedará sin memoria. Por lo tanto, hay una manera de establecer la "vida útil de la sesión".

Si nadie usó la sesión durante un intervalo de tiempo, entonces se borra sola: todos los objetos que almacenó se eliminan de ella. Esto se hace para ahorrar memoria.

Por defecto, este intervalo es de 1800 segundos == 30 minutos. Si establece el valor en -1, la sesión será "eterna" y se eliminará solo cuando el usuario cierre la pestaña del navegador (bueno, o el cliente se desconecte).

Ejemplos:

// get all keys
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}
// set the inactivity interval
session.setMaxInactiveInterval(60*60*24);   // 1 day
session.setMaxInactiveInterval(-1); // until the browser is closed
// remove all data from the session
session.invalidate();