[Java Web Series] Análise de princípio e detalhes de uso de cookies

Continue a criar, acelere o crescimento! Este é o terceiro dia da minha participação no "Nuggets Daily New Plan · June Update Challenge", clique para ver os detalhes do evento

1. Análise do Princípio do Cookie

O princípio de implementação dos cookies é baseado no protocolo HTTP , que envolve as informações do cabeçalho da solicitação e do cabeçalho de resposta no protocolo HTTP:

  • Cabeçalhos de resposta :set-cookie
  • Cabeçalho da solicitação :cookie

imagem-20220527232940263

  1. Quando o navegador do cliente acessa o servidor, o servidor envia as informações de dados ao navegador adicionando Set-Cookie na resposta HTTP. 响应头字段
  2. Depois que o navegador obtém o resultado da resposta, ele pode obter o Set-Cookievalor correspondente do cabeçalho da resposta e salvar o cookie na memória do navegador ou no disco rígido.
  3. Quando o servidor é solicitado novamente, o navegador envia o cookie de volta ao servidor web adicionando um cookie à mensagem de solicitação HTTP. 请求头字段
  4. O servidor rastreia o status do cliente de acordo com as informações do cookie, e o objeto Request encapsula o valor correspondente ao cookie no cabeçalho da solicitação em um objeto cookie e, finalmente, forma um array de cookies
  • Envie um cookie para o navegador

imagem-20220505150650460

  • Obter cookies do cache do navegador

imagem-20220505150558851

2. Detalhes de uso de cookies

1️⃣Tempo de vida do cookie

Por padrão, os cookies são armazenados na memória do navegador, quando o navegador é fechado e a memória é liberada, os cookies são destruídos, ou seja, cookies em nível de sessão.

Definir o tempo de armazenamento de cookies

  • Defina o tempo de sobrevivência do cookie, ou seja, o cookie persistente , neste momento o cookie é armazenado 电脑磁盘no
// 单位:秒
setMaxAge(int seconds)
复制代码
  • Detalhes de configuração de parâmetros de segundos
  1. 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

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

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

2️⃣Cookie存储中文

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

imagem-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. 演示结果
  • 存储到浏览器的是编码后的中文

imagem-20220505160653985

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

imagem-20220505160557661

三、Cookie的缺点

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

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

Acho que você gosta

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