JSP: seguimiento de sesiones

En este capítulo, discutiremos el seguimiento de sesiones en JSP. HTTP es un protocolo "sin estado", lo que significa que cada vez que un cliente recupera una página web, el cliente abre una conexión separada al servidor web y el servidor automáticamente no guarda ningún registro de la solicitud anterior del cliente.

Mantenimiento de la sesión entre el cliente web y el servidor

Analicemos ahora algunas opciones para mantener la sesión entre el cliente web y el servidor web:

Galletas

Un servidor web puede asignar un ID de sesión único como una cookie a cada cliente web y para las solicitudes posteriores del cliente, pueden ser reconocidos utilizando la cookie recibida.

Es posible que esta no sea una forma eficaz, ya que el navegador a veces no admite cookies. No se recomienda utilizar este procedimiento para mantener las sesiones.

Campos de formulario ocultos

Un servidor web puede enviar un campo de formulario HTML oculto junto con una ID de sesión única de la siguiente manera:

<input type = "hidden" name = "sessionid" value = "12345">

Esta entrada significa que, cuando se envía el formulario, el nombre y el valor especificados se incluyen automáticamente en el GET o la POSTdatos. Cada vez que el navegador web devuelve la solicitud, elsession_id value se puede utilizar para realizar un seguimiento de diferentes navegadores web.

Esta puede ser una forma eficaz de realizar un seguimiento de la sesión, pero hacer clic en un enlace de hipertexto normal (<A HREF...>) no da como resultado el envío de un formulario, por lo que los campos de formulario ocultos tampoco pueden admitir el seguimiento general de la sesión.

Reescritura de URL

Puede agregar algunos datos adicionales al final de cada URL. Estos datos identifican la sesión; el servidor puede asociar ese identificador de sesión con los datos que ha almacenado sobre esa sesión.

Por ejemplo, con http://tutorialspoint.com/file.htm;sessionid=12345, el identificador de sesión se adjunta como sessionid = 12345 al que se puede acceder en el servidor web para identificar al cliente.

La reescritura de URL es una mejor manera de mantener sesiones y funciona para los navegadores cuando no admiten cookies. El inconveniente aquí es que tendrá que generar cada URL de forma dinámica para asignar un ID de sesión, aunque la página es una página HTML estática simple.

El objeto de la sesión

Aparte de las opciones mencionadas anteriormente, JSP hace uso de la interfaz HttpSession proporcionada por el servlet. Esta interfaz proporciona una forma de identificar a un usuario.

  • una solicitud de una página o
  • visitar un sitio web o
  • almacenar información sobre ese usuario

De forma predeterminada, las JSP tienen habilitado el seguimiento de sesiones y se crea una instancia de un nuevo objeto HttpSession para cada nuevo cliente automáticamente. Para deshabilitar el seguimiento de sesiones, es necesario desactivarlo explícitamente estableciendo el atributo de sesión de directiva de página en falso de la siguiente manera:

<%@ page session = "false" %>

El motor JSP expone el objeto HttpSession al autor JSP a través de la implícita sessionobjeto. Ya quesession El objeto ya está provisto al programador JSP, el programador puede comenzar a almacenar y recuperar datos inmediatamente del objeto sin ninguna inicialización o getSession().

Aquí hay un resumen de los métodos importantes disponibles a través del objeto de sesión:

S.No. Método y descripción
1

public Object getAttribute(String name)

Este método devuelve el objeto vinculado con el nombre especificado en esta sesión, o nulo si no hay ningún objeto vinculado con el nombre.

2

public Enumeration getAttributeNames()

Este método devuelve una enumeración de objetos String que contiene los nombres de todos los objetos vinculados a esta sesión.

3

public long getCreationTime()

Este método devuelve la hora en la que se creó esta sesión, medida en milisegundos desde la medianoche del 1 de enero de 1970 GMT.

4

public String getId()

Este método devuelve una cadena que contiene el identificador único asignado a esta sesión.

5

public long getLastAccessedTime()

Este método devuelve la última vez que el cliente envió una solicitud asociada con esta sesión, como el número de milisegundos desde la medianoche del 1 de enero de 1970 GMT.

6

public int getMaxInactiveInterval()

Este método devuelve el intervalo de tiempo máximo, en segundos, que el contenedor de servlets mantendrá abierta esta sesión entre accesos de clientes.

7

public void invalidate()

Este método invalida esta sesión y desvincula cualquier objeto vinculado a ella.

8

public boolean isNew()

Este método devuelve verdadero si el cliente aún no conoce la sesión o si el cliente elige no unirse a la sesión.

9

public void removeAttribute(String name)

Este método elimina el objeto vinculado con el nombre especificado de esta sesión.

10

public void setAttribute(String name, Object value)

Este método vincula un objeto a esta sesión, utilizando el nombre especificado.

11

public void setMaxInactiveInterval(int interval)

Este método especifica el tiempo, en segundos, entre las solicitudes del cliente antes de que el contenedor de servlets invalide esta sesión.

Ejemplo de seguimiento de sesiones

Este ejemplo describe cómo utilizar el objeto HttpSession para averiguar la hora de creación y la hora del último acceso a una sesión. Asociaríamos una nueva sesión con la solicitud si aún no existe una.

<%@ page import = "java.io.*,java.util.*" %>
<%
   // Get session creation time.
   Date createTime = new Date(session.getCreationTime());
   
   // Get last access time of this Webpage.
   Date lastAccessTime = new Date(session.getLastAccessedTime());

   String title = "Welcome Back to my website";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");

   // Check if this is new comer on your Webpage.
   if (session.isNew() ){
      title = "Welcome to my website";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } 
   visitCount = (Integer)session.getAttribute(visitCountKey);
   visitCount = visitCount + 1;
   userID = (String)session.getAttribute(userIDKey);
   session.setAttribute(visitCountKey,  visitCount);
%>

<html>
   <head>
      <title>Session Tracking</title>
   </head>
   
   <body>
      <center>
         <h1>Session Tracking</h1>
      </center>
      
      <table border = "1" align = "center"> 
         <tr bgcolor = "#949494">
            <th>Session info</th>
            <th>Value</th>
         </tr> 
         <tr>
            <td>id</td>
            <td><% out.print( session.getId()); %></td>
         </tr> 
         <tr>
            <td>Creation Time</td>
            <td><% out.print(createTime); %></td>
         </tr> 
         <tr>
            <td>Time of Last Access</td>
            <td><% out.print(lastAccessTime); %></td>
         </tr> 
         <tr>
            <td>User ID</td>
            <td><% out.print(userID); %></td>
         </tr> 
         <tr>
            <td>Number of visits</td>
            <td><% out.print(visitCount); %></td>
         </tr> 
      </table> 
   
   </body>
</html>

Ahora ponga el código anterior en main.jsp e intenta acceder http://localhost:8080/main.jsp. Una vez que ejecute la URL, recibirá el siguiente resultado:

Bienvenidos a mi sitio web

Session Information

Información de la sesión valor
carné de identidad 0AE3EC93FF44E3C525B4351B77ABB2D5
Tiempo de creación Martes 08 de junio 17:26:40 GMT + 04: 00 2010
Hora del último acceso Martes 08 de junio 17:26:40 GMT + 04: 00 2010
ID de usuario A B C D
Número de visitas 0

Ahora intente ejecutar el mismo JSP por segunda vez, recibirá el siguiente resultado.

Bienvenido de nuevo a mi sitio web

Session Information

tipo de información valor
carné de identidad 0AE3EC93FF44E3C525B4351B77ABB2D5
Tiempo de creación Martes 08 de junio 17:26:40 GMT + 04: 00 2010
Hora del último acceso Martes 08 de junio 17:26:40 GMT + 04: 00 2010
ID de usuario A B C D
Número de visitas 1

Eliminar datos de la sesión

Cuando haya terminado con los datos de sesión de un usuario, tiene varias opciones:

  • Remove a particular attribute - Puedes llamar al public void removeAttribute(String name) método para eliminar el valor asociado con una clave en particular.

  • Delete the whole session - Puedes llamar al public void invalidate() método para descartar una sesión completa.

  • Setting Session timeout - Puedes llamar al public void setMaxInactiveInterval(int interval) método para establecer el tiempo de espera para una sesión individualmente.

  • Log the user out - Los servidores que admiten servlets 2.4, puede llamar logout para cerrar la sesión del cliente en el servidor web e invalidar todas las sesiones que pertenecen a todos los usuarios.

  • web.xml Configuration - Si está utilizando Tomcat, además de los métodos mencionados anteriormente, puede configurar el tiempo de espera de la sesión en el archivo web.xml de la siguiente manera.

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

El tiempo de espera se expresa en minutos y anula el tiempo de espera predeterminado, que es de 30 minutos en Tomcat.

los getMaxInactiveInterval( )El método en un servlet devuelve el período de tiempo de espera para esa sesión en segundos. Entonces, si su sesión está configurada en web.xml durante 15 minutos,getMaxInactiveInterval( ) devuelve 900.