Desarrollo de la gestión de sesiones en servlets

Acerca de esta tarea

Esta información, combinada con el ejemplo de codificación SessionSample.java, proporciona un modelo de programación para implementar sesiones en sus propios servlets.

Procedimiento

  1. Obtenga el objeto HttpSession.

    Para obtener una sesión, utilice el getSession método de la javax.servlet.http.HttpServletRequest objeto en el servlet Java™ 3.0 API.

    Cuando obtenga por primera vez el objeto HttpSession, el recurso Gestión de sesiones usa uno de los tres procedimientos para establecer el rastreo de la sesión: utilizar cookies, volver a escribir el URL o información de SSL (Secure Sockets Layer).
    Característica obsoleta: El seguimiento de sesiones mediante el ID SSL está obsoleto en WebSphere® Application Server versión 7.0. Puede configurar el rastreo de sesiones para utilizar cookies o modificar la aplicación para utilizar la reescritura de URL.

    Imagine que el recurso Gestión de sesiones utiliza cookies. En tal caso, el recurso Gestión de sesiones crea un ID de sesión exclusivo y lo envía al navegador como una cookie. Cada solicitud posterior de este usuario (en el mismo navegador) pasa la cookie que contiene el ID de sesión y el recurso Gestión de sesiones utiliza este ID para buscar el objeto HttpSession actual del usuario.

    En el paso 1 del código de ejemplo, el valor booleano (crear) se establece entruede manera que la HttpSession El objeto se crea si aún no existe. (Con el servlet 2.3 API y posteriormente, el javax.servlet.http.HttpServletRequest.getSession() método sin valores predeterminados booleanos paratruey crea una sesión si aún no existe ninguna para este usuario).

  2. Almacene y recupere los datos definidos por el usuario en la sesión.

    Después de establecer una sesión, puede añadir y recuperar datos definidos por el usuario para la sesión. El HttpSession El objeto tiene métodos similares a los de java.util.Dictionary para agregar, recuperar y eliminar objetos Java arbitrarios.

    En el paso 2 del ejemplo de código, el servlet lee un objeto entero de HttpSession, lo incrementa y lo vuelve a escribir. Puede utilizar cualquier nombre para identificar valores en el objeto HttpSession. El código de ejemplo usa el nombre sessiontest.counter.

    Puesto que el objeto HttpSession es compartido por servlets a los que el usuario puede acceder, considere seguir un convenio de denominación en el ámbito del sitio para evitar conflictos.

  3. (Opcional) Genere una salida de página de respuesta de HTML que contenga datos del objeto HttpSession.
  4. Informe al usuario de que ha tenido lugar una acción durante la sesión. Es aconsejable transferir el código HTML al navegador del cliente, que indica que se ha producido la acción.
    Por ejemplo, en el paso 3 del ejemplo de código, el servlet genera una página web que se devuelve al usuario y visualiza el valor de sessiontest.counter cada vez que el usuario visita la página web durante la sesión.
  5. (Opcional) Notifique a los usuarios conectados.
    Se notifica acerca de los objetos almacenados en una sesión que implementan la interfaz javax.servlet.http.HttpSessionBindingListener cuando la sesión está preparándose para su finalización y se invalida. Este aviso le permite efectuar procesos posteriores a la sesión como, por ejemplo, guardar permanentemente en una base de datos los cambios realizados durante la sesión.
  6. Finalice la sesión.
    Se puede finalizar una sesión:
    • Automáticamente con el recurso Gestión de sesiones, si la sesión ha estado inactiva durante un tiempo especificado. Los administradores proporcionan una manera de especificar el período de tiempo después del cual se ha de invalidar una sesión.
    • Codificando el servlet para que llame al método invalidate() en el objeto de sesión.

Ejemplo


import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;


public class SessionSample  extends HttpServlet {
  public void doGet (HttpServletRequest request, HttpServletResponse response)  
       throws ServletException, IOException {


   // Step 1: Get the Session object
 
      boolean create = true;         
      HttpSession session = request.getSession(create);
 
   // Step 2: Get the session data value


      Integer ival = (Integer)              
      session.getAttribute ("sessiontest.counter");         
      if (ival == null) ival = new Integer (1);         
      else ival = new Integer (ival.intValue () + 1);           
      session.setAttribute ("sessiontest.counter", ival);       

   // Step 3: Output the page

      response.setContentType("text/html"); 
      PrintWriter out = response.getWriter(); 
      out.println("<html>");  
      out.println("<head><title>Session Tracking Test</title></head>");
      out.println("<body>");
      out.println("<h1>Session Tracking Test</h1>");
      out.println ("You have hit this page " + ival + " times" + "<br>");
      out.println ("Your " + request.getHeader("Cookie"));
      out.println("</body></html>");    
   }
}