【JavaWebシリーズ】Cookieの主成分分析と使用法の詳細

創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・6月アップデートチャレンジ」に参加して3日目です。クリックしてイベントの詳細をご覧ください。

1.クッキーの原則の分析

Cookieの実装原則は、HTTPプロトコルに基づいています。これには、HTTPプロトコルの要求ヘッダーと応答ヘッダーの情報が含まれます。

  • 応答ヘッダーset-cookie
  • リクエストヘッダーcookie

画像-20220527232940263

  1. クライアントブラウザがサーバーにアクセスすると、サーバーはHTTP応答にSet-Cookie 响应头字段を追加して、データ情報をブラウザに送信します。
  2. ブラウザは応答結果を取得した後、Set-Cookie応答ヘッダーから対応する値を取得し、ブラウザのメモリまたはハードディスクにCookieを保存できます。
  3. サーバーが再度要求されると、ブラウザはHTTP要求メッセージにCookie 请求头字段を追加することにより、CookieをWebサーバーに送り返します。
  4. サーバーはCookie情報に従ってクライアントのステータスを追跡し、RequestオブジェクトはRequestヘッダーのCookieに対応する値をCookieオブジェクトにカプセル化し、最後にCookie配列を形成します。
  • ブラウザにCookieを送信します

画像-20220505150650460

  • ブラウザのキャッシュからCookieを取得する

画像-20220505150558851

2.Cookieの使用状況の詳細

1️⃣クッキーの寿命

デフォルトでは、Cookieはブラウザのメモリに保存されます。ブラウザを閉じてメモリを解放すると、Cookie、つまりセッションレベルのCookieが破棄されます。

クッキーの保存時間を設定する

  • Cookieの存続時間、つまり永続的なCookieを設定します。この時点で、Cookieはに保存さ电脑磁盘れます。
// 单位:秒
setMaxAge(int seconds)
复制代码
  • のパラメータ設定詳細
  1. 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

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

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

2️⃣Cookie存储中文

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

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

画像-20220505160653985

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

画像-20220505160557661

三、Cookie的缺点

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

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

おすすめ

転載: juejin.im/post/7102440383598526477