[Serie web de Java] Principio de análisis y detalles de uso de las cookies

¡Continúe creando, acelere el crecimiento! Este es el tercer día de mi participación en el "Nuggets Daily New Plan · June Update Challenge", haz clic para ver los detalles del evento

1. Análisis del Principio de las Cookies

El principio de implementación de las cookies se basa en el protocolo HTTP , que involucra el encabezado de la solicitud y la información del encabezado de la respuesta en el protocolo HTTP:

  • Encabezados de respuesta :set-cookie
  • Encabezado de la solicitud :cookie

imagen-20220527232940263

  1. Cuando el navegador del cliente accede al servidor, el servidor envía la información de datos al navegador agregando Set-Cookie en la respuesta HTTP. 响应头字段
  2. Una vez que el navegador obtiene el resultado de la respuesta, puede obtener el Set-Cookievalor correspondiente del encabezado de la respuesta y guardar la cookie en la memoria del navegador o en el disco duro.
  3. Cuando se vuelve a solicitar el servidor, el navegador envía la cookie de regreso al servidor web agregando una cookie al mensaje de solicitud HTTP. 请求头字段
  4. El servidor rastrea el estado del cliente de acuerdo con la información de la cookie, y el objeto de solicitud encapsula el valor correspondiente a la cookie en el encabezado de la solicitud en un objeto de cookie y finalmente forma una matriz de cookies .
  • Enviar una cookie al navegador

imagen-20220505150650460

  • Obtener cookies de la memoria caché del navegador

imagen-20220505150558851

2. Detalles de uso de cookies

1️⃣Tiempo de vida de las cookies

Por defecto, las cookies se almacenan en la memoria del navegador, cuando se cierra el navegador y se libera la memoria, se destruyen las cookies, es decir, las cookies a nivel de sesión.

Establecer tiempo de almacenamiento de cookies

  • Establezca el tiempo de supervivencia de la cookie, es decir, la cookie persistente , en este momento la cookie se almacena 电脑磁盘en el
// 单位:秒
setMaxAge(int seconds)
复制代码
  • Detalles de configuración de parámetros de segundos
  1. 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

  2. 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁

  3. :使用 setMaxAge(0) 手动删除 Cookie时,需要使用 setPath 方法指定 Cookie 的路径,且该路径必须与创建 Cookie 时的路径保持一致

2️⃣Cookie存储中文

默认Cookie不能存储中文,直接传入中文会报500的错误

imagen-20220505153208266

解决方案

  1. 在AServlet中对中文进行URL编码,采用URLEncoder.encode(),将编码后的值存入Cookie中

  2. 在BServlet中获取Cookie中的值,获取的值为URL编码后的值

  3. 将获取的值在进行URL解码,采用URLDecoder.decode(),就可以获取到对应的中文值

示例

  1. 在Servlet1中对中文进行URL编码
@WebServlet("/c1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.对中文进行UTF-8编码
        String username = "倔强的牛角";
        String encodeUserName = URLEncoder.encode(username, StandardCharsets.UTF_8);
        // 2.创建cookie对象,存入编码后的中文
        Cookie c1 = new Cookie("username", encodeUserName);
        Cookie c2 = new Cookie("password", "123456");
        // 3.设置存活时间,1周 7天
        c1.setMaxAge(60*60*24*7);
        c2.setMaxAge(60*60*24*7);
        // 4.向浏览器发送cookie
        response.addCookie(c1);
        response.addCookie(c2);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
复制代码
  1. 在Servlet2中获取值,并对值进行解码
@WebServlet(name = "CookieDemo", value = "/c2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.获取cookie数组
        Cookie[] cookies = request.getCookies();
        // 2.遍历数组
        for (Cookie cookie : cookies) {
            String cookieName = cookie.getName();
            String cookieValue = cookie.getValue();
            if ("username".equals(cookieName)) {
                // 对中文进行UTF-8解码
                String decodeUserName = URLDecoder.decode(cookieValue, StandardCharsets.UTF_8);
                System.out.println("key:" + cookieName + ",value:" + decodeUserName);
                continue;
            }
            System.out.println("key:" + cookieName + ",value:" + cookieValue);
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
复制代码
  1. 演示结果
  • 存储到浏览器的是编码后的中文

imagen-20220505160653985

  • 获取编码的中文,并解码

imagen-20220505160557661

三、Cookie的缺点

Cookie 虽然可以解决服务器跟踪用户状态的问题,但是它具有以下缺点:

  • 在 HTTP 请求中,Cookie 是明文传递的,容易泄露用户信息,安全性不高
  • 浏览器可以禁用 Cookie,一旦被禁用,Cookie 将无法正常工作。
  • Cookie 对象中只能设置文本信息(字符串)信息。
  • 客户端浏览器保存 Cookie 的数量和长度是有限制的。

Supongo que te gusta

Origin juejin.im/post/7102440383598526477
Recomendado
Clasificación