首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深入理解 Cookie:原理、客戶端/服務端交互與 JavaScript 封裝庫

     編輯:Java 相關知識

Cookie 是伺服器透過 HTTP 響應頭 Set-Cookie 送至瀏覽器的鍵值對,瀏覽器後續請求自動攜帶同域 Cookie。本文系統梳理其屬性、交互流程,並提供一套易用的 JavaScript 封裝庫。

Cookie 完整屬性解析

Set-Cookie: customer=huangxp; path=/foo; domain=ibm.com; expires=Wed, 19-Oct-2005 23:12:40 GMT; Secure; HttpOnly
屬性說明
domain關聯域名,預設為當前請求域。不匹配時瀏覽器拒絕存儲
path路徑前綴過濾,只有請求路徑匹配才發送 Cookie
expires過期時間(GMT),缺失則為會話級 Cookie,關閉瀏覽器失效
Secure僅 HTTPS 傳輸
HttpOnly禁止 JavaScript 讀取(防 XSS),需 IE6+ 支援

瀏覽器處理流程

響應階段(存儲)

  1. 提取所有 Set-Cookie 頭
  2. 解析名稱、值、屬性
  3. 檢查域/路徑/安全策略,通過則存入本地

請求階段(發送)

  1. 根據請求 URL 篩選符合域/路徑的 Cookie
  2. 按路徑長度排序(長路徑優先)
  3. 組裝 Cookie: name1=val1; name2=val2 頭發送

客戶端/服務端代碼對照

服務端寫入

HttpCookie ck = new HttpCookie("TestCK");
ck.setValue("1"); ck.setDomain("example.com"); ck.setPath("/");
ck.setMaxAge(3600); ck.setHttpOnly(true); ck.setSecure(true);
response.addCookie(ck);

客戶端讀取

document.cookie // "TestCK=1; other=2"
document.cookie.split("; ").reduce((obj, kv) => { const [k,v]=kv.split("="); obj[k]=v; return obj; }, {})

客戶端寫入

document.cookie = "TestCK=1; expires=Wed, 19 Oct 2025 23:12:40 GMT; path=/; domain=example.com";

服務端讀取

Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) if ("TestCK".equals(c.getName())) value = c.getValue();

關鍵差異提醒

  • 客戶端 document.cookie 無法讀取 domain、path、expires、HttpOnly 等屬性
  • 客戶端刪除 Cookie:設定 expires=過期時間
  • 多值 Cookie:服務端 HttpCookie 支援 Values 集合,客戶端以 & 分隔(name=val1&val2)

JavaScript 封裝庫:CookieAdapter

提供類似服務端 HttpCookie 的操作體驗:

// 核心類
function CookieObj(name) { this.Name = name; this.KeyValues = []; }
CookieObj.prototype = {
  set: function(key, value) { /* 支援單值/多值 */ },
  remove: function(key) { /* 刪除指定鍵 */ },
  get: function() { return this.getItemByKey("__Default"); },
  getItemByKey: function(key) { /* 返回 KeyValuePair */ }
};

var CookieAdapter = {
  getCookies: function() { /* 解析 document.cookie 返回 CookieObj[] */ },
  getCookieByName: function(name) { /* 查找單個 */ },
  setCookies: function(arr, expires, domain, path, secure, httponly) { /* 批量寫入 */ },
  _ConvertToCookieObj: function(str) { /* 內部解析 */ }
};

使用範例

// 寫入
var ck = new CookieObj("User");
ck.set("__Default", "john");
ck.set("role", "admin");
CookieAdapter.setCookies([ck], new Date("2025-12-31"), "example.com", "/");

// 讀取
var cookies = CookieAdapter.getCookies();
var user = CookieAdapter.getCookieByName("User");
console.log(user.get().Value); // "john"
console.log(user.getItemByKey("role").Value); // "admin"

// 刪除
user.remove("role");
CookieAdapter.setCookies([user]);

最佳實踐建議

  • 敏感資料(Session ID、Token)務必設定 HttpOnly; Secure
  • 跨子域共享:設定 domain=.example.com
  • 單頁應用優先考慮 localStorage + Authorization Header,減少 Cookie 體積與 CSRF 風險
  • 定期清理過期/無用 Cookie,避免請求頭膨脹影響效能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved