HTTP es un protocolo sin estado, lo que significa que cada vez que un cliente recupera una página web, se abre una conexión de servidor separada, por lo que el servidor no registra ninguna información de solicitudes anteriores del cliente.
Hay tres formas de mantener una sesión cliente-servidor:
Un servidor web puede asignar una ID de sesión única como cookie para representar a cada cliente e identificar solicitudes posteriores de ese cliente.
Esta puede no ser una forma eficiente, porque muchas veces los navegadores no necesariamente soportan cookies, por lo que no recomendamos utilizar este método para mantener la sesión.
Un servidor web puede enviar un campo de formulario HTML oculto y una ID de sesión única, como esta:
<tipo de entrada="oculto" nombre="id de sesión" valor="12345">
Esta entrada significa que cuando se envía el formulario, el nombre y el valor especificados se incluirán automáticamente en los datos GET o POST. Siempre que el navegador envía una solicitud, el valor de session_id se puede utilizar para guardar rastros de diferentes navegadores.
Este enfoque puede ser eficiente, pero hacer clic en un hipervínculo en una etiqueta <A HREF> no genera un evento de envío de formulario, por lo que los campos de formulario ocultos no admiten el seguimiento universal de sesiones.
Puede agregar algunos datos adicionales después de cada URL para distinguir la sesión, y el servidor puede asociar el identificador de sesión en función de estos datos.
Por ejemplo, http://w3cschool.cn/file.htm;sessionid=12345, el identificador de sesión es sessionid=12345, el servidor puede utilizar estos datos para identificar al cliente.
En comparación, reescribir la URL es una mejor manera y funcionará incluso si el navegador no admite cookies, pero la desventaja es que debe especificar dinámicamente el ID de sesión para cada URL, incluso si es una página HTML simple.
Además de los métodos anteriores, JSP utiliza la interfaz HttpSession proporcionada por el servlet para identificar a un usuario y almacenar toda la información de acceso de este usuario.
De forma predeterminada, JSP permite el seguimiento de sesiones y se creará automáticamente una instancia de un nuevo objeto HttpSession para nuevos clientes. Para deshabilitar el seguimiento de sesiones es necesario desactivarlo explícitamente, lo que se logra estableciendo el valor del atributo de sesión en la directiva de la página en falso, de la siguiente manera:
<%@ sesión de página="false" %>
El motor JSP expone el objeto de sesión subyacente a los desarrolladores. Dado que se proporciona el objeto de sesión, los desarrolladores pueden almacenar o recuperar datos fácilmente.
La siguiente tabla enumera algunos métodos importantes del objeto de sesión:
SN | Método y descripción |
---|---|
1 | public Object getAttribute(String name) devuelve el objeto vinculado al nombre especificado en el objeto de sesión, o nulo si no existe. |
2 | La enumeración pública getAttributeNames() devuelve todos los nombres de objetos en el objeto de sesión. |
3 | public long getCreationTime() devuelve la hora en que se creó el objeto de sesión, en milisegundos, a partir de la madrugada del 1 de enero de 1970 |
4 | public String getId() devuelve el ID del objeto de sesión |
5 | public long getLastAccessedTime() devuelve la hora del último acceso del cliente, en milisegundos, a partir de la madrugada del 1 de enero de 1970 |
6 | public int getMaxInactiveInterval() devuelve el intervalo de tiempo máximo, en segundos, durante el cual el contenedor de servlets mantendrá la sesión abierta |
7 | public void invalidate() invalida la sesión y desvincula cualquier objeto vinculado a la sesión. |
8 | public boolean isNew( devuelve si es un cliente nuevo o si el cliente se niega a unirse a la sesión |
9 | public void removeAttribute(String name) elimina el objeto con el nombre especificado en la sesión |
10 | public void setAttribute (nombre de cadena, valor de objeto) utiliza el nombre y el valor especificados para generar un objeto y vincularlo a la sesión |
11 | public void setMaxInactiveInterval(intervalo int) se utiliza para especificar el tiempo, en segundos, durante el cual el contenedor de servlets mantendrá la sesión válida. |
Este ejemplo describe cómo utilizar el objeto HttpSession para obtener la hora de creación y la hora del último acceso. Asociaremos un nuevo objeto de sesión con el objeto de solicitud si aún no existe.
<%@ page import="java.io.*,java.util.*" %><% // Obtener la hora de creación de la sesión Date createTime = new Date(session.getCreationTime()); // Obtener la hora de la sesión. última página visitada Fecha lastAccessTime = new Date(session.getLastAccessedTime()); String title = "Bienvenido a mi sitio web" Integer visitCount = new Integer(0); new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD" // Comprobar si la página web es visitada por un nuevo usuario if (session.isNew()); ){ título = "Bienvenido a mi sitio web"; session.setAttribute(userIDKey, userID session.setAttribute(visitCountKey, visitCount); (Entero)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); </title></head><body><center><h1>Seguimiento de sesiones</h1></center><table align="center"> <tr bgcolor="#949494"> <th>Información de la sesión</th> <th>Valor</th></tr> <tr> <td>id</td> <td><% out.print( session. getId()); %></td></tr> <tr> <td>Hora de creación</td> <td><% out.print(createTime); tr> <td>Hora del último acceso</td> <td><% out.print(lastAccessTime %></td></tr> <tr> <td>ID de usuario</td> <td><%); out.print(userID); %></td></tr> <tr> <td>Número de visitas</td> <td><% out.print(visitCount); tr> </tabla> </cuerpo></html>
Intente acceder a http://localhost:8080/main.jsp. Se obtendrán los siguientes resultados cuando se ejecute por primera vez:
Visite nuevamente y obtendrá los siguientes resultados:
Después de procesar los datos de la sesión de un usuario, tiene las siguientes opciones:
Eliminar un atributo específico:
Llame al método público void removeAttribute(String name) para eliminar el atributo especificado.
Eliminar toda la sesión:
Llame al método public void invalidate() para invalidar toda la sesión.
Establecer período de validez de la sesión:
Llame al método public void setMaxInactiveInterval(int intervalo) para establecer el tiempo de espera de la sesión.
Cerrar sesión de usuario:
Los servidores que admiten la versión 2.4 del servlet pueden llamar al método logout() para cerrar la sesión del usuario e invalidar todas las sesiones relacionadas.
Configurar el archivo web.xml:
Si está utilizando Tomcat, puede configurar el archivo web.xml de la siguiente manera:
<session-config> <session-timeout>15</session-timeout> </session-config>
El tiempo de espera es en minutos y el tiempo de espera predeterminado en Tomcat es de 30 minutos.
El método getMaxInactiveInterval() en Servlet devuelve el tiempo de espera en segundos. Si se configuran 15 minutos en web.xml, el método getMaxInactiveInterval() devolverá 900.