English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Sesión de JSP

HTTP es un protocolo sin estado, lo que significa que cada vez que el cliente recupera una página web, debe abrir una conexión de servidor separada, por lo que el servidor no registra ninguna información de la solicitud anterior del cliente.

Hay tres métodos para mantener la sesión entre el cliente y el servidor:

    Cookies

El servidor de red puede especificar un ID de sesión único como cookie para representar cada cliente, utilizado para identificar la solicitud siguiente del cliente.

Esto puede no ser una manera efectiva, ya que en muchos casos, el navegador no necesariamente admite cookies, por lo que no recomendamos usar este método para mantener la sesión.

    Campo de formulario oculto

Un servidor de red puede enviar un campo de formulario HTML oculto y un ID de sesión único, como se muestra a continuación:

<input type="hidden" name="sessionid" value="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. Cada vez que el navegador envíe una solicitud, el valor de session_id se puede usar para rastrear las trazas de diferentes navegadores.

Esta manera puede ser una manera efectiva, pero al hacer clic en el enlace en la etiqueta <A HREF>, no se generará un evento de envío de formulario, por lo que no se admite el seguimiento de sesión oculto de formulario universal.

    Modificar la URL

Puede agregar algunos datos adicionales al final de cada URL para distinguir las sesiones, y el servidor puede asociar el identificador de sesión en función de estos datos.

Por ejemplo, http://oldtoolbag.com/file.htm;sessionid=12345, el identificador de sesión es sessionid=12345, el servidor puede usar estos datos para identificar al cliente.

Comparativamente, modificar la URL es una manera mejor, incluso si el navegador no admite cookies, también puede funcionar, 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.

    Objeto session

Además de los métodos mencionados anteriormente, JSP utiliza el interfaz HttpSession proporcionado por servlet para identificar a un usuario, y almacenar toda la información de acceso de este usuario.

Por defecto, JSP permite el seguimiento de sesión, y un nuevo objeto HttpSession se ejemploiza automáticamente para un nuevo ejemplo de cliente HTTP. Para deshabilitar el seguimiento de sesión, es necesario hacerlo explícitamente, configurando el valor de la propiedad session de la instrucción page en false, como se muestra a continuación:

<%@ page session="false" %>

El motor JSP expone implícitamente el objeto session a los desarrolladores. Gracias a la disponibilidad del objeto session, los desarrolladores pueden almacenar o recuperar datos de manera conveniente.

La siguiente tabla enumera algunos métodos importantes del objeto session:

S.N.Método & Descripción
                1public Object getAttribute(String name) Devuelve el objeto asociado con el nombre especificado en el objeto session, o null si no existe
                2public Enumeration getAttributeNames() Devuelve todos los nombres de objetos en el objeto session
                3public long getCreationTime() Devuelve el tiempo de creación del objeto sesión, en milisegundos, desde1970 años1mes1Desde la medianoche
                4public String getId() Devuelve la ID del objeto sesión
                5public long getLastAccessedTime() Devuelve el tiempo de acceso del cliente por última vez, en milisegundos, desde1970 años1mes1Desde la medianoche
                6public int getMaxInactiveInterval() Devuelve el intervalo máximo de tiempo, en segundos, durante el cual el contenedor de servlet mantendrá abierta la sesión
                7public void invalidate() Invalidar la sesión, desvincular cualquier objeto asociado con la sesión
                8public boolean isNew() Devuelve si es un nuevo cliente o si el cliente ha rechazado unirse a la sesión
                9public void removeAttribute(String name) Eliminar el objeto especificado por nombre de la sesión
                10public void setAttribute(String name, Object value)  Usar el nombre y el valor especificados para crear un objeto y lo asociar con la sesión
                11public void setMaxInactiveInterval(int interval) Usado para especificar el tiempo, en segundos, durante el cual el contenedor de servlet mantendrá válida la sesión

Aplicación de sesión JSP

Esta instancia describe cómo usar el objeto HttpSession para obtener la hora de creación y la última hora de acceso. Vamos a asociar un nuevo objeto sesión al objeto request, si este objeto no existe.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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 última página de acceso
   Date lastAccessTime = new Date(session.getLastAccessedTime());
   String title = "Nueva visita al sitio de tutoriales básicos";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");
   // Detectar si hay nuevos usuarios que acceden a la página web
   if (session.isNew()){
      title = "Ejemplo de acceso básico al sitio de tutoriales";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey, visitCount);
   } else {
       visitCount = (Integer)session.getAttribute(visitCountKey);
       visitCount += 1;
       userID = (String)session.getAttribute(userIDKey);
       session.setAttribute(visitCountKey, visitCount);
   }
%>
<html>
<head>
<title>Seguimiento de sesión</title>
</head>
<body>
<h1>Seguimiento de sesión</h1>
<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>Información de sesión</th>
   <th>Valor</th>
</tr> 
<tr>
   <td>id</td>
   <td><% out.print(session.getId()); %></td>
</tr> 
<tr>
   <td>Fecha de creación</td>
   <td><% out.print(createTime); %></td>
</tr> 
<tr>
   <td>Última hora de acceso</td>
   <td><% out.print(lastAccessTime); %></td>
</tr> 
<tr>
   <td>ID de usuario</td>
   <td><% out.print(userID); %></td>
</tr> 
<tr>
   <td>Veces de acceso</td>
   <td><% out.print(visitCount); %></td>
</tr> 
</table> 
</body>
</html>

intente acceder http://localhost:8080/testjsp/main.jsp Al ejecutarse por primera vez, se obtendrá el siguiente resultado:

Al volver a acceder, se obtendrá el siguiente resultado:

Eliminar datos de sesión

Después de procesar los datos de sesión de un usuario, puede tener las siguientes opciones:

  • Eliminar un atributo específico:

    Llame al método public void removeAttribute(String name) para eliminar el atributo especificado.

  • Eliminar toda la sesión:

    Llame al método public void invalidate() para hacer que toda la sesión sea inválida.

  • Configurar la duración de la sesión:

    Llame al método public void setMaxInactiveInterval(int interval) para configurar el tiempo de expiración de la sesión.

  • Cerrar sesión del usuario:

    Soporta servlet2.4Los servidores de versiones del servidor pueden llamar al método logout() para cerrar sesión del usuario y hacer que todas las sesiones relacionadas sean inválidas.

  • Configurar el archivo web.xml:

    Si se utiliza Tomcat, puede configurar el archivo web.xml de la siguiente manera:

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

El tiempo de expiración se expresa en minutos, el tiempo de expiración predeterminado en Tomcat es30 minutos.

El método getMaxInactiveInterval( ) en Servlet devuelve el tiempo de expiración en segundos. Si en web.xml se configura15Si transcurren minutos, el método getMaxInactiveInterval( ) devolverá900。