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

Seguimiento de sesión de Servlet

HTTP es un protocolo "sin estado", lo que significa que cada vez que el cliente solicita una página web, el cliente abre una conexión separada al servidor web y el servidor no mantiene ningún registro de las solicitudes anteriores del cliente.

Pero aún así, existen tres formas de mantener la sesión de sesión entre el cliente web y el servidor web:

Cookies

Un servidor web puede asignar un ID de sesión de sesión único como cookie para cada cliente web, y para las solicitudes posteriores del cliente se puede identificar usando la cookie recibida.

Esto podría no ser un método válido, ya que muchos navegadores no admiten cookies, por lo que recomendamos no usar este método para mantener la sesión de sesión.

Campo de formulario oculto

Un servidor web puede enviar un campo de formulario HTML oculto, así como un ID de sesión 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, los nombres y valores especificados se incluirán automáticamente en los datos GET o POST. Cada vez que el navegador web envía una solicitud de vuelta, el valor de session_id se puede usar para mantener el seguimiento de diferentes navegadores web.

Esto podría ser una manera efectiva de mantener el seguimiento de la sesión de sesión, pero hacer clic en enlaces de hipertexto regulares (A HREF...) no causará el envío del formulario, por lo que los campos de formulario ocultos tampoco admiten el seguimiento de sesión de sesión regular.

Reescritura de URL

Puede agregar algunos datos adicionales al final de cada URL para identificar la sesión de sesión, y el servidor asociará el identificador de sesión de sesión con los datos almacenados sobre la sesión de sesión.

Por ejemplo, http://oldtoolbag.com/file.htm;sessionid=12345,el identificador de sesión de sesión se adjunta como sessionid=12345,el identificador puede ser accedido por el servidor web para identificar al cliente.

La reescritura de URL es una manera mejor de mantener la sesión de sesión, que funciona bien cuando el navegador no admite cookies, pero su desventaja es que genera dinámicamente cada URL para asignar un ID de sesión de sesión a la página, incluso en páginas HTML estáticas simples.

Objeto HttpSession

Además de las tres formas mencionadas anteriormente, Servlet también proporciona la interfaz HttpSession, que ofrece una manera de identificar usuarios y almacenar información sobre usuarios a través de múltiples solicitudes de página o acceso al sitio web.

El contenedor de Servlet utiliza esta interfaz para crear una sesión de sesión entre un cliente HTTP y un servidor HTTP. La sesión se mantiene durante un período de tiempo especificado, a través de múltiples conexiones o solicitudes de página.

Usted pasará a través de la llamada a los métodos públicos de HttpServletRequest getSession() Para obtener el objeto HttpSession, como se muestra a continuación:

HttpSession session = request.getSession();

Necesita llamarlo antes de enviar cualquier contenido de documento al cliente. request.getSession()A continuación, se resume algunos métodos importantes disponibles en el objeto HttpSession:

NúmeroMétodo y descripción
1public Object getAttribute(String name)
Este método devuelve el objeto que tiene el nombre especificado en la sesión de sesión, o null si no hay un objeto especificado.
2public Enumeration getAttributeNames()
Este método devuelve un enumerado de String que contiene todos los nombres de los objetos que están unidos a la sesión de sesión.
3public long getCreationTime()
Este método devuelve el tiempo en que se creó la sesión de sesión desde el tiempo universal coordinado (UTC). 1970 años 1 Mes 1 Desde la medianoche del día, en milisegundos.
4public String getId()
Este método devuelve una cadena que contiene un identificador único asignado a la sesión de sesión.
5public long getLastAccessedTime()
Este método devuelve el tiempo desde que el cliente envió la última solicitud relacionada con la sesión de sesión desde el tiempo universal coordinado (UTC). 1970 años 1 Mes 1 Desde la medianoche del día, en milisegundos.
6public int getMaxInactiveInterval()
Este método devuelve el intervalo máximo de tiempo que el contenedor Servlet mantiene la sesión de sesión abierta en el acceso del cliente, en segundos.
7public void invalidate()
Este método indica que la sesión de sesión es inválida y desvincula cualquier objeto que esté asociado con ella.
8public boolean isNew()
Si el cliente aún no conoce la sesión de sesión o si el cliente elige no participar en la sesión de sesión, este método devuelve true.
9public void removeAttribute(String name)
Este método elimina el objeto especificado de la sesión de sesión.
10public void setAttribute(String name, Object value)
Este método une un objeto al session de sesión utilizando el nombre especificado.
11public void setMaxInactiveInterval(int interval)
Este método especifica el tiempo entre solicitudes del cliente en segundos antes de que el contenedor Servlet indique que la sesión de sesión es inválida.

Ejemplo de seguimiento de sesión

Este ejemplo explica cómo usar el objeto HttpSession para obtener la hora de creación y la última visita de la sesión. Si no existe una sesión de sesión, crearemos una nueva sesión de sesión a través de la solicitud.

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * Clase de implementación de Servlet SessionTrack
 */
@WebServlet("/SessionTrack)
public class SessionTrack extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // Si no existe una sesión de sesión, se creará un objeto de sesión
        HttpSession session = request.getSession(true);
        // Obtener la hora de creación de la sesión
        Date createTime = new Date(session.getCreationTime());
        // Obtener la última vez que se accedió a esta página web
        Date lastAccessTime = new Date(session.getLastAccessedTime());
         
        //Establecer el formato de salida de la fecha  
        SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    
        String title = "Ejemplo de Servlet Session - Tutoriales básicos
        Integer visitCount = new Integer(0);
        String visitCountKey = new String("visitCount");
        String userIDKey = new String("userID");
        String userID = new String("w3codebox");
        if(session.getAttribute(visitCountKey) == null) {
            session.setAttribute(visitCountKey, new Integer(0));
        }
    
        // Revisar si hay nuevos visitantes en la página web
        if (session.isNew()){
            title = "Ejemplo de Servlet Session - Tutoriales básicos
             session.setAttribute(userIDKey, userID);
        } else {
             visitCount = (Integer)session.getAttribute(visitCountKey);
             visitCount = visitCount + 1;
             userID = (String)session.getAttribute(userIDKey);
        }
        session.setAttribute(visitCountKey,  visitCount);
    
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
    
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" +
                "<h1 align=\"center\">" + title + "</h1>\n" +
                 "<h2 align=\"center\">Información de sesión</h2>\n" +
                "<table border=\"1\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>Información de sesión</th><th>Valor</th></tr>\n" +
                "<tr>\n" +
                "  <td>ID</td>\n" +
                "  <td>" + session.getId() + "</td></tr>\n" +
                "<tr>\n" +
                "  <td>Fecha de creación</td>\n" +
                "  <td>" +  df.format(createTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Última hora de acceso</td>\n" +
                "  <td>" + df.format(lastAccessTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>ID de usuario </td>\n" +
                "  <td>" + userID + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Estadísticas de acceso:</td>\n" +
                "  <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>"); 
    }
}

Compile el Servlet superior SessionTrack, y cree una entrada adecuada en el archivo web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- nombre de la clase -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- paquete en el que se encuentra -->
    <servlet-class>com.w3codebox.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- Sitio web visitado -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

Ingrese en la barra de direcciones del navegador http://localhost:8080/TomcatTest/SessionTrackCuando ejecute por primera vez, mostrará el siguiente resultado:

Vuelva a ejecutar el mismo Servlet, y mostrará el siguiente resultado:

Eliminar los datos de sesión

Después de completar los datos de sesión de un usuario, tiene las siguientes opciones:

  • Eliminar un atributo específico:Puede llamar a public void removeAttribute(String name) método para eliminar el valor asociado con una clave específica.

  • Eliminar toda la sesión de sesión:Puede llamar a public void invalidate() método para desechar toda la sesión de sesión.

  • para establecer el tiempo de expiración de la sesión de sesión.Puede llamar a public void setMaxInactiveInterval(int interval) método para establecer el tiempo de expiración de sesión de sesión de manera individual.

  • Cerrar sesión del usuario:Si está utilizando un servlet 2.4 del servidor, puede llamar a cerrar sesión Para cerrar sesión del cliente del servidor web y establecer todas las sesiones de sesión de todos los usuarios como inválidas.

  • Configuración de web.xml:Si está utilizando Tomcat, además de los métodos mencionados anteriormente, también puede configurar el tiempo de expiración de la sesión de sesión en el archivo web.xml, como se muestra a continuación:

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

El tiempo de expiración en el ejemplo anterior se expresa en minutos y cubrirá el tiempo de expiración predeterminado de Tomcat 3Tiempo de expiración de 0 minutos.

El método getMaxInactiveInterval() en un Servlet devuelve el tiempo de expiración de la sesión de sesión en segundos. Por lo tanto, si se configura el tiempo de expiración de la sesión de sesión en web.xml 15 minutos, entonces getMaxInactiveInterval() devolverá 900。