Notas detalladas sobre cookies y sesiones

1️⃣ Tecnología de cookies

1.1 Objeto de cookie

  1. Crea un objeto Cookie para almacenar datos de sesión
new Cookie(String name, String value)
  1. Modificar objeto de cookie
void setPath(String url)
void setMaxAge(int expiry) 
void setValue(String newValue) 
  1. Envíe los datos de las cookies al navegador para guardar
response.addCookie(cookie);
  1. El navegador visita el servidor con la cookie y el servidor recibe la información de la cookie.
request.getCookies();

1.2 Principios de la tecnología de cookies

  1. El servidor crea un objeto Cookie, guarda los datos de la sesión y envía los datos de la cookie al navegador.
response.addCookie(cookie); // (响应头:set-cookie: name=iacky)
  1. El navegador obtiene los datos de las cookies, los guarda en la caché del navegador y luego transporta los datos de las cookies cuando visita el servidor la próxima vez.
(请求头: cookie: name=chen)
  1. El servidor obtiene los datos de las cookies enviados por el navegador.
request.getCookies();

1.3 Detalles de las cookies.

  1. El tipo de datos de la cookie debe ser una cadena. Si desea enviar chino, primero debe cifrar la URL china antes de enviarla.
  2. setPath (ruta): modifica la ruta efectiva donde se encuentra la cookie.
  • ¿Qué es una ruta válida?
    Si la cookie se establece en una ruta válida, cuando el navegador visite esta ruta válida, los datos de la cookie se llevarán al servidor.
  1. setMaxAge (integer): establece la hora válida de la cookie
  • Entero positivo: Indica que cuando el tiempo exceda el valor del entero positivo, la cookie se perderá !! (Las cookies se almacenan en el directorio de caché del navegador) Unidad: segundos.
  • Entero negativo: significa que si se cierra el navegador, la cookie se perderá (la cookie guarda la memoria del navegador)
  • 0: significa eliminar la cookie con el mismo nombre
  1. Puede haber varias cookies, pero los navegadores generalmente solo permiten almacenar 300 cookies, cada sitio puede almacenar hasta 20 cookies y el tamaño de cada cookie está limitado a 4 KB.

1.4 Código de plantilla

public class Cookiedemo1 extends HttpServlet {
    
    
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    
        // 创建Cookie对象,保存会话数据
        // 如果发送中文,必须先使用URLEncoder进行加密
        String name = URLEncoder.encode("张三", "utf-8");
        Cookie c1 = new Cookie("name", name);
        Cookie c2 = new Cookie("email", "[email protected]");
        // 发送cookie
        response.addCookie(c1);
        response.addCookie(c2);
        // 浏览器下次访问获取已有的cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
    
    
            for (Cookie cookie : cookies) {
    
    
                // cookie的名
                String cname = cookie.getName();
                // cookie的值
                String cvalue = cookie.getValue();
                // 解密
                cvalue = URLDecoder.decode(cvalue, "utf-8");
                System.out.println(cname + "=" + cvalue);
            }
        } else {
    
    
            System.out.println("没有cookie信息!");
        }
    }
}

1.5 Caja de galletas

Inserte la descripción de la imagen aquí

2️⃣Tecnología de sesión

Concepto: Sesión representa una sesión entre el servidor y el navegador, este proceso es continuo o intermitente. En Servlet, sesión se refiere a un objeto de la clase HttpSession.

2.1 estructura de datos de sesión

En servlet / jsp, ¿qué estructura de datos usa el contenedor para almacenar variables relacionadas con la sesión? Supongamos, en primer lugar, que debe operarse de forma sincrónica, porque la sesión se comparte entre subprocesos en un entorno de subprocesos múltiples, y los servidores web generalmente son de subprocesos múltiples (para mejorar el rendimiento, también se utiliza la tecnología de grupo); en segundo lugar , esto La estructura de datos debe ser fácil de operar, preferiblemente el método tradicional de acceso a pares clave-valor .

Por lo tanto, centrémonos primero en un único objeto de sesión. Además de almacenar su propia información relacionada, como id, la sesión de Tomcat también proporciona a los programadores una interfaz para almacenar otra información (在类org.apache.catalina.session. StandardSession里):

public void setAttribute(String name, Object value, boolean notify)

Aquí puede rastrear qué tipo de datos usa:

protected Map attributes = new ConcurrentHashMap();

Esto es muy claro, y si un gato usa ConcurrentHashMapobjetos para almacenar datos, solo necesita cumplir dos puntos: sincronizarse con facilidad .

Entonces, ¿qué estructura de datos usa Tomcat para almacenar todos los objetos de sesión?

  • O bien ConcurrentHashMap (在管理session的org.apache.catalina.session. ManagerBase类里):
protected Map<String, Session> sessions = new ConcurrentHashMap<String, Session>();

2.2 Pasos de creación de la sesión / hora de creación / hora de eliminación / cómo mantener:

Pasos:
Cuando la página JSP no prohíbe explícitamente la sesión, al abrir el navegador para solicitar la JSP por primera vez:

  1. El servidor creará automáticamente una sesión para él y le dará un ID de sesión.
  2. Enviado al navegador del cliente. Cuando el cliente posteriormente solicite otros recursos en esta aplicación, agregará automáticamente lo siguiente al encabezado de la solicitud:Cookie:JSESSIONID=客户端第一次拿到的session ID
  3. Cuando el servidor recibe una solicitud, recibirá el ID de sesión, encontrará el objeto de sesión creado previamente en la memoria de acuerdo con el ID y lo proporcionará a la solicitud. Este es también el principio básico del uso de sesiones.

Se reproducen pasos más detallados:

  1. El usuario solicita una página jsp, y la página se establece con session = "true";

  2. El contenedor Servlet / jsp lo traduce a un servlet y carga y ejecuta el servlet;

  3. Cuando el contenedor Servlet / jsp encapsula el objeto HttpServletRequest, determina si enlazar la sesión actual a HttpRequest o crear un nuevo objeto de sesión basado en si hay jsessionid en la cookie o url. Binding);

  4. El programa opera la sesión a pedido y accede a los datos;

  5. Si se trata de una sesión recién creada, en la respuesta del resultado, el contenedor agregará un encabezado Set-cookie para recordarle al navegador que debe mantener la sesión (o usar la reescritura de URL para presentar el nuevo enlace al usuario).

A través de la descripción anterior, los lectores deben comprender cuándo se creó la sesión. Aquí hay un resumen del nivel de servlet: Cuando el servlet solicitado por el usuario llama al método getSession, se obtendrá la sesión. En cuanto a si crear una nueva sesión, depende de si la solicitud actual es La sesión se ha vinculado. Cuando el cliente agrega el identificador jsessionid a la solicitud y el contenedor de servlet encuentra el objeto de sesión correspondiente basado en este identificador, vinculará la sesión al objeto de solicitud de esta solicitud, y la solicitud del cliente no contiene jsessionid o el jsessionid correspondiente Cuando la sesión ha expirado, la vinculación de la sesión no se puede completar y se debe crear una nueva sesión en este momento. Al mismo tiempo, se envía el encabezado Set-cookie para notificar al cliente que comience a mantener una nueva sesión.


Hora de creación:
un malentendido común es que una sesión se crea cuando un cliente accede a ella. Sin embargo, la verdad es:

  1. Cuando el servlet solicitado por el usuario llama al método getSession, obtendrá la sesión. La creación de una nueva sesión depende de si la solicitud actual está vinculada a la sesión.
  2. Cuando el cliente agrega el identificador jsessionid a la solicitud y el contenedor de servlet encuentra el objeto de sesión correspondiente basado en este identificador, vinculará la sesión al objeto de solicitud de esta solicitud, y la solicitud del cliente no contiene jsessionid o el jsessionid correspondiente Cuando la sesión ha expirado, la vinculación de la sesión no se puede completar y se debe crear una nueva sesión en este momento . Al mismo tiempo, se envía el encabezado Set-cookie para notificar al cliente que comience a mantener una nueva sesión.

Eliminar hora :

Hay dos situaciones para la destrucción de la sesión: tiempo de espera y destrucción manual.

  1. Tiempo de espera de sesión: Tiempo de espera significa que el servidor no ha recibido la solicitud del cliente correspondiente a la sesión durante un cierto período de tiempo, y este tiempo excede el tiempo de espera máximo de sesión establecido por el servidor.

  2. Llamada a programaHttpSession.invalidate()
    Inserte la descripción de la imagen aquí

  3. El servidor está inactivo o el servicio está detenido


Cómo mantener:
Cuando se crea la sesión por primera vez, el cliente traerá el identificador de sesión al servidor en solicitudes posteriores. El programa del servidor puede llamar a getSession cuando la sesión es necesaria, y el servidor puede vincular la sesión correspondiente a la solicitud actual, a fin de lograr el mantenimiento del estado. Por supuesto, esto requiere el apoyo del cliente, si las cookies están deshabilitadas y no se usa la reescritura de URL, la sesión no se puede mantener.

Vuelva a escribir la URL agregando jsessionid al encabezado de solicitud de URL de cada solicitud para mantener la conexión

Si un servlet no llama a getSession entre varias solicitudes (o simplemente solicita una página estática), ¿se interrumpirá la sesión? Esto no sucederá, porque el cliente solo enviará el valor legal de la cookie al servidor. En cuanto a lo que hace el servidor con la cookie, no le importa y, por supuesto, no puede. Una vez establecida la sesión, el cliente siempre transmitirá el identificador de sesión al servidor, independientemente de si la página solicitada es dinámica, estática o incluso una imagen.

2.3 Pasos de uso de la sesión;

Objeto HttpSession:

  1. Cree el objeto HttpSession para guardar los datos de la sesión
session = request.getSession(); 创建或获取session对象。
  1. Modificar el objeto HttpSession
void setMaxInactivelnterval(int interval)设置session对象的有效时间。
void invalidate()  手动销毁session对象
  1. Guardar datos de sesión (como objetos de dominio)
session.setAttribute("name",Object);   保存数据
session.getAttribute("name")       获取数据
session.removeAttribute("name")    删除数据。

2.4 Código de plantilla

Inserte la descripción de la imagen aquí

2.5 El principio de sesión

  • Pregunta: ¿Cómo distingue el servidor entre diferentes sesiones de navegador?
  • Requisito previo: ¡Los datos que se pueden recuperar del objeto de sesión deben ser el objeto de sesión que almacena los datos!

¿Puede encontrar los resultados de la sesión cuando abre la misma página en el mismo navegador y abre la misma página en diferentes navegadores de la siguiente manera?

  1. Navegador 1-Ventana 1 (001):
//1 创建HttpSession对象
HttpSession session = request.getSession()
//2 保存会话数据。
session.setAttribute("name"," jacky");
  1. Navegador 1-Ventana 2 (001): disponible
//1 创建HttpSession对象
HttpSession session = request.getSession()
//2 保存会话数据。
session.setAttribute("name"," jacky");
  1. Navegador 2: no disponible
//1 创建HttpSession对象
HttpSession session = request.getSession()
//2 保存会话数据。
session.setAttribute("name"," jacky");
  1. Nuevo navegador 1 (sin marcar o no 001): no disponible
//1 创建HttpSession对象
HttpSession session = request.getSession()
//2 保存会话数据。
session.setAttribute("name"," jacky");

2.6 detalles de la sesión

  1. setMaxinactivelnterval (segundos): establece el tiempo efectivo del objeto de sesión,
  • Pregunta: ¿Dónde se destruye la sesión?
  • Nota: ¡El objeto de sesión se destruirá si el navegador no está cerrado!
  • Valor predeterminado: espere 30 minutos de inactividad antes de que se destruya el objeto de sesión.
<!--设置全局的session对象的过期时间(分钟)-->
<session-config>
	<session-timeout>1</session-timeout>
</session-config>
  1. JSESSIONID no desaparecerá cuando se cierre el navegador
/*设置JSESSIONID的时间,不会随着浏览器关闭而丢失!*/ 
Cookie c = new Cookie ("JSESSIONTD",session.getId());
c.setMaxAge (1*30*24*60*60) ;  //1个月
response.addCookie(c); 
  1. Destruya manualmente directamente el objeto sessino v
invalidate( ); 
  1. Crear u obtener un objeto de sesión
创建或得到session对象,查询session对象
request.getSession() / request.getSession(true)
如果没有sessino对象,则创建新的session对象
request.getSession(false)
得到session对象,查询session对象,如果没有session对象,直接返回null

2.7 principio de sesión

Esta línea de código incluye los siguientes seis pasos

 HttpSession session = request.getSession();
  • El servidor crea un objeto de sesión y el servidor asigna una etiqueta única JSESSIONID al objeto de sesión.
  • Envíe el JSESSIONID como una cookie al navegador.
  • El navegador obtiene el JSESSIONID y lo guarda, y lleva este JSESSIONID para acceder al servidor durante la próxima visita.
  • El servidor obtiene el JSESSIONID y busca el objeto de sesión con el JSSESSINOID especificado en la memoria del servidor.
    • Si lo encuentra, devuelva este objeto de sesión
    • Si no se encuentra, puede devolver nulo directamente o crear un nuevo objeto de sesión.

3️⃣Las similitudes y diferencias entre Cookie y Session

Tanto la cookie como la sesión pertenecen a subpaquetes del paquete de servlet

3.1 Características

Características de las cookies:

  1. Los datos de la sesión se colocan en el lado del navegador
  2. El tipo de datos solo puede ser una cadena y hay un límite de tamaño, que es relativamente inseguro para el almacenamiento de datos.

Características de la sesión:

  1. Los datos de la sesión se colocan en el lado del servidor (memoria del servidor), ocupando los recursos del servidor
  2. Cualquier tipo de datos, sin límite de tamaño
  3. Relativamente seguro

3.2 Lugar de almacenamiento

cookie:
Inserte la descripción de la imagen aquí
sesión del navegador : servidor
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_40597409/article/details/113685337
Recomendado
Clasificación