[Java Web Series] Prinzipanalyse und Verwendungsdetails von Cookies

Schaffen Sie weiter, beschleunigen Sie das Wachstum! Dies ist der dritte Tag meiner Teilnahme an der „Nuggets Daily New Plan · June Update Challenge“, klicken Sie hier, um die Details der Veranstaltung anzuzeigen

1. Analyse des Cookie-Prinzips

Das Implementierungsprinzip von Cookies basiert auf dem HTTP-Protokoll , das die Informationen des Request-Headers und des Response-Headers im HTTP-Protokoll beinhaltet:

  • Antwortheader :set-cookie
  • Anforderungsheader :cookie

Bild-20220527232940263

  1. Wenn der Client-Browser auf den Server zugreift, sendet der Server die Dateninformationen an den Browser , indem er Set-Cookie in die HTTP-Antwort einfügt. 响应头字段
  2. Nachdem der Browser das Antwortergebnis erhalten hat, kann er den Set-Cookieentsprechenden Wert aus dem Antwortheader abrufen und das Cookie im Browserspeicher oder auf der Festplatte speichern.
  3. Wenn der Server erneut angefordert wird, sendet der Browser das Cookie zurück an den Webserver, indem er der HTTP-Anforderungsnachricht ein Cookie hinzufügt. 请求头字段
  4. Der Server verfolgt den Status des Clients gemäß den Cookie-Informationen, und das Request-Objekt kapselt den Wert, der dem Cookie im Anforderungs-Header entspricht, in ein Cookie-Objekt ein und bildet schließlich ein Cookie-Array
  • Senden Sie ein Cookie an den Browser

Bild-20220505150650460

  • Holen Sie sich Cookies aus dem Browser-Cache

Bild-20220505150558851

2. Details zur Cookie-Nutzung

1️⃣Cookie-Lebensdauer

Standardmäßig werden Cookies im Speicher des Browsers gespeichert. Wenn der Browser geschlossen und der Speicher freigegeben wird, werden die Cookies zerstört, dh Cookies auf Sitzungsebene.

Legen Sie die Cookie-Speicherzeit fest

  • Legen Sie die Cookie-Überlebenszeit fest, dh das dauerhafte Cookie电脑磁盘 , zu diesem Zeitpunkt wird das Cookie auf dem gespeichert
// 单位:秒
setMaxAge(int seconds)
复制代码
  • Parametereinstellungsdetails von Sekunden
  1. 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

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

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

2️⃣Cookie存储中文

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

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

Bild-20220505160653985

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

Bild-20220505160557661

三、Cookie的缺点

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

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

Ich denke du magst

Origin juejin.im/post/7102440383598526477
Empfohlen
Rangfolge