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

Servlet Cookie 完整指南:API 詳解、使用場景與最佳實踐

     編輯:Java 相關知識

前言

Cookie 是 HTTP 協議中實現有狀態會話的核心機制。Java Servlet API 提供了 javax.servlet.http.Cookie 類,封裝了 Cookie 的創建、屬性設置與讀寫操作。本文系統梳理 Cookie API、常用屬性、代碼模式與安全最佳實踐。

Cookie 工作原理

  1. 服務端創建 Cookie,通過 HttpServletResponse.addCookie() 發送給瀏覽器(Set-Cookie Header)。
  2. 瀏覽器本地存儲(文本文件/內存),後續請求自動攜帶(Cookie Header)。
  3. 服務端通過 HttpServletRequest.getCookies() 讀取並識別用戶。

Cookie 核心 API 速查表

方法說明關鍵點
new Cookie(name, value)構造器名稱創建後不可變;值建議 URL 編碼
setMaxAge(int seconds)設置生存時間>0 持久化;=0 刪除;<0 會話級(關閉瀏覽器失效)
getMaxAge()獲取生存時間默認 -1
setDomain(String domain)設置可見域如 .example.com 覆蓋所有子域
getDomain()獲取域
setPath(String path)設置可見路徑默認當前路徑;/ 覆蓋全站
getPath()獲取路徑
setSecure(boolean)僅 HTTPS 傳輸生產環境必開
setHttpOnly(boolean)禁止 JS 訪問防 XSS 攻擊,Servlet 3.0+ 支持
setComment(String)用途說明部分瀏覽器可見
getName() / getValue()獲取名/值

代碼實戰模式

模式一:標準 API 寫入

Cookie cookie = new Cookie("RMKEY", useResVo.getRmkey());
cookie.setMaxAge(3600);           // 1小時
cookie.setDomain(".why.com");     // 共享給子域
cookie.setPath("/");              // 全站可見
cookie.setSecure(true);           // 僅 HTTPS
cookie.setHttpOnly(true);         // 防 XSS
response.addCookie(cookie);

模式二:手動構造 Header(兼容舊容器/特殊需求)

String header = String.format("%s=%s; Path=/; Domain=%s; Max-Age=%d; Secure; HttpOnly",
    cookieName, cookieValue, domain, maxAge);
response.addHeader("Set-Cookie", header);

模式三:讀取 Cookie

Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie c : cookies) {
        if ("RMKEY".equals(c.getName())) {
            String value = c.getValue(); // 取值
            break;
        }
    }
}

關鍵屬性深度解析

1. Max-Age vs Expires

  • Max-Age (秒):HTTP 1.1 標準,優先級高,精確控制。
  • Expires (GMT 時間):HTTP 1.0 遺留,受客戶端系統時間影響。
  • 建議:僅使用 setMaxAge()。

2. Domain 與 Path 作用域控制

  • Domain=.example.com:a.example.com、b.example.com 皆可見。
  • Path=/:全站路徑可見;Path=/app:僅 /app/* 可見。
  • 安全原則:最小權限原則,僅在必要範圍設置。

3. Secure + HttpOnly 雙重防護

  • Secure:僅 HTTPS 傳輸,防竊聽。
  • HttpOnly:JS 無法讀取 document.cookie,防 XSS 盜取 Session ID。
  • 現代框架默認開啟:Spring Session、Shiro 等默認設置。

4. SameSite 屬性(Servlet API 暫無直接支持)

  • SameSite=Strict:完全禁止跨站攜帶。
  • SameSite=Lax:允許鏈接跳轉攜帶(默認)。
  • SameSite=None; Secure:跨站攜帶,需 HTTPS。
  • 變通方案:手動添加 Header response.addHeader("Set-Cookie", "name=val; SameSite=Lax")。

常見場景與最佳實踐

場景一:記住登錄(持久化 Cookie)

Cookie remember = new Cookie("rememberMe", token);
remember.setMaxAge(7 * 24 * 3600); // 7天
remember.setPath("/");
remember.setHttpOnly(true);
remember.setSecure(true);
response.addCookie(remember);

場景二:單點登錄(跨域共享 Cookie)

  • 主域設置 setDomain(".parent.com")
  • 所有子域應用共享同一 Cookie
  • 需配合統一 Session 存儲(Redis 集群)

場景三:購物車/偏好設置(客戶端狀態)

  • 小數據(<4KB)可直接存 Cookie
  • 大數據僅存 ID,服務端存詳情
  • 敏感信息禁存 Cookie

安全檢查清單

  • [ ] 關鍵 Cookie 必設置 HttpOnly
  • [ ] 生產環境必設置 Secure
  • [ ] 設置合理 Max-Age,避免永久有效
  • [ ] Domain/Path 遵循最小權限
  • [ ] 敏感操作驗證 CSRF Token,不僅依賴 Cookie
  • [ ] 定期輪換加密簽名密鑰

總結

Cookie 是 Web 狀態管理的基石。掌握 Cookie 類 API、Max-Age/Domain/Path/Secure/HttpOnly/SameSite 六大屬性的組合策略,能構建安全、可控、高性能的會話體驗。現代開發建議:核心會話用 Server-Side Session + Cookie 存 SessionID,業務狀態用 LocalStorage/IndexedDB,Cookie 僅承擔身份標識傳遞。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved