Discusión en profundidad de los principios de implementación de la sesión.

1.Session implementación del mecanismo
de servidor es cómo lograr el navegador de un usuario como un servicio?

Diagrama esquemático del principio de la sesión

Explicación:
Si el navegador A accede por primera vez al Servlet1, en este momento crea una sesión con un número de identificación de 110, y luego Servlet1 devuelve este número de identificación al navegador A en forma de cookie. Luego, si el navegador A continúa accediendo a Servlet2, entonces Esta solicitud traerá el valor de Cookie: JSESSIONID = 110, y luego el servidor encuentra la Sesión en la memoria de acuerdo con el número de ID pasado por el Navegador A.
En este momento, si el navegador B llegó a acceder al Servlet1, su solicitud no trajo el valor de cookie de JSESSIONID, ya que también usa Session, por lo que el servidor creará una nueva sesión, el número de ID es 119 y este número de ID es Cookie Regreso al navegador B. El proceso posterior es el mismo que A.

Ilustramos este principio a través de Servlet1 y Servlet2 en [Conocimientos básicos de la sesión (1)], donde Servlet1 se usa para crear una sesión y agregar atributos; Servlet2 se usa para leer los atributos en la sesión.
Ahora visitamos Servlet1 y capturamos el paquete:

Set-Cookie

Como puede ver, no hay información de cookies en los encabezados de solicitud, y existe una oración en los encabezados de respuesta:

Set-Cookie: JSESSIONID = 2150AE444BF83FDACEA04BD0289F5AE2; Ruta = / Sesión1 /; HttpOnly

Esto muestra que el servidor pasó el atributo JSESSIONID al cliente a través de la cookie.

Luego visitamos Servlet2 y capturamos el paquete de la siguiente manera:

Galleta

Puede ver que el encabezado Set-Cookie no aparece en Encabezados de respuesta, y el encabezado Cookie está incluido en Encabezados de solicitud:

Cookie: JSESSIONID = 2150AE444BF83FDACEA04BD0289F5AE2

Y este encabezado contiene JSESSIONID, y su valor es el valor de JSESSIONID en nuestro Set-Cookie anterior.
Esto prueba el principio de la Sesión que ilustramos anteriormente, es decir, el mecanismo por el cual el servidor puede distinguir diferentes sesiones para diferentes navegadores.

Pero hay otro problema aquí: dijimos antes que las cookies son compartidas por múltiples navegadores. Dado que JSESSIONID se guarda en el cliente como una cookie, ¿por qué no pueden ser compartidos por múltiples navegadores?

De hecho, la respuesta es muy simple: esta cookie para almacenar JSESSIONID es una cookie de sesión, no una cookie persistente. Al aprender las cookies, aprendimos cómo configurar el ciclo de vida de la cookie. Si se establece el ciclo de vida de la cookie, la cookie se escribirá en el archivo del disco y se almacenará hasta el final del ciclo de vida, y luego se borrará automáticamente; Si no se establece el ciclo de vida de la cookie, esta cookie es la Cookie de sesión, es decir, la cookie de sesión, que solo existe durante el período en que se abre el navegador. Si el navegador está cerrado, la cookie desaparecerá.
En otras palabras, la cookie de sesión existe en la memoria del navegador y desaparece cuando se cierra el navegador. Por lo tanto, el JSESSIONID también existe en la Cookie de sesión, por lo que, naturalmente, ¡no puede ser compartido por varios navegadores!

Entonces, ¿es posible cerrar un navegador y luego abrir el navegador para acceder a la página en este momento, y esta página aún puede guardar su información? Por ejemplo, después de cerrar IE y luego abrir IE, el último producto comprado sigue ahí.

Análisis, si no configuramos el ciclo de vida de la sesión en el programa, por lo que su ciclo de vida es el tiempo predeterminado de 30 minutos, entonces si el navegador está cerrado, de acuerdo con el mecanismo de implementación de la sesión introducido anteriormente, el servidor no sabe si el navegador se ha cerrado en este momento Sí, es decir, la sesión en el servidor todavía existe y no se destruirá hasta 30 minutos después.
Entonces, si traemos cookies en este momento: JSESSIONID = 2150AE444BF83FDACEA04BD0289F5AE2, vaya a la página justo antes de que se cierre el navegador, el servidor aún puede encontrar la sesión anterior y proporcionarnos datos relevantes.

A través del análisis anterior, esta función se puede lograr usando la combinación de Sesión y Cookie.

Ahora, modifiquemos Servlet1 y Servlet2.
Establezca la sesión en Servlet1, agregue atributos y luego pase la ID de la sesión al cliente a través de la cookie, y el nombre de la cookie es "JSESSIONID", el valor es la ID de la sesión, esta ID se puede pasar directamente a través de la sesión. getId () obtiene. , Su método doGet es el siguiente:

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();

    //创建一个session,默认生命周期为30min,并放入一个属性
    HttpSession session = request.getSession();
    session.setAttribute("name", "小明");
    out.println("创建Session成功,并放入了一个值");

    // 把该sessionid保存在cookie
    // 这个cookie的键为JSESSIONID
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(3600);
    response.addCookie(cookie);
}

Servlet2 permanece sin cambios, todavía solo va a la sesión para obtener este atributo. Los experimentos muestran que después de cerrar el navegador, abra el navegador nuevamente para acceder a Servlet2, y el valor en la sesión aún se puede recuperar.

Prueba

¿Por qué? Porque nuestro Servlet1 ha guardado el JSESSIONID en el archivo del disco mediante una cookie. Comprender el mecanismo de realización de la sesión, esto no es difícil de entender.

2. Después de que el usuario desactivar proceso cookie de sesión
, donde hay una situación, si el navegador del usuario inhabilitar la cookie de cómo hacerlo? Por ejemplo, deshabilité las cookies de Chrome de la siguiente manera:

Deshabilitar cookies

En este momento, cuando vamos a visitar algunos sitios web grandes, como los sitios web de compras, obviamente podemos encontrar que muchas funciones del sitio web ya no se pueden realizar normalmente. Por ejemplo, si inicio sesión en JD, el servidor no puede obtener el código de verificación que ingresé, como se muestra en la siguiente figura:

Consejos JD

La razón es muy simple, porque desactivé las cookies, por lo tanto, la sesión del lado del servidor no se puede usar, porque las cookies no pueden guardar JSESSIONID.

Volviendo al último ejemplo de carrito de compras simple en [Servlet (2) Aplicación simple], si deshabilitamos las cookies, descubriremos que solo hay un libro que se ha comprado en el carrito de compras cada vez, y no podemos encontrar el anterior. La razón es la misma, entonces, ¿cómo resolver esta situación?

Solución: reescritura de URL

La respuesta en el Servlet proporciona un método para reescribir URL:

response.encodeRedirectURL (String url) -utilizado para reescribir la dirección url después del método sendRedirect response.encodeURL (String url) -utilizado para reescribir la dirección url
de la acción del formulario y el hipervínculo

Entonces, ¿qué significa reescritura de URL? De hecho, el JSESSIONID se agrega artificialmente a la URL. Por ejemplo, si modificamos el carrito de compras simple que escribimos antes, todos los hipervínculos de clic para comprar en ShowBook ​​deben reescribirse.
Escribimos esto antes:

out.println("<tr><td>"+book.getName()+"</td><td><a href='/MyCart/BuyBookCl?id="+book.getId()+"'>点击购买</a></td></tr>");

Ahora para reescribir URL:

request.getSession();
String url = "/MyCart/BuyBookCl?id="+book.getId();
url = response.encodeURL(url);
out.println("<tr><td>"+book.getName()+"</td><td><a href='"+url+"'>点击购买</a></td></tr>");

Cabe señalar que el método request.getSession () debe llamarse o asegurarse antes de volver a escribir.

Podemos ver la diferencia entre estos enlaces a través del archivo de código fuente. Antes de reescribir, el código fuente para acceder a ShowBook ​​se ve así:

Código fuente de ShowBook ​​antes de reescribir URL

Después de reescribir:

Código fuente de ShowBook ​​después de reescribir URL

Se puede ver que después de reescribir la URL, el parámetro jsessionid se agrega automáticamente a la url, lo que garantiza que nuestra sesión continúe usándose normalmente cuando las cookies están deshabilitadas. En este momento, verificamos la barra de direcciones del carrito de compras de la siguiente manera, puede ver claramente el parámetro jsessionid:

Transferencia de ShowMyCart
desde

17 artículos originales publicados · ganó 24 · vistas 280,000 +

Supongo que te gusta

Origin blog.csdn.net/qq_22956867/article/details/79415953
Recomendado
Clasificación