Cookie 是 HTTP 協議中實現有狀態會話的核心機制。Java Servlet API 提供了 javax.servlet.http.Cookie 類,封裝了 Cookie 的創建、屬性設置與讀寫操作。本文系統梳理 Cookie API、常用屬性、代碼模式與安全最佳實踐。
HttpServletResponse.addCookie() 發送給瀏覽器(Set-Cookie Header)。HttpServletRequest.getCookies() 讀取並識別用戶。| 方法 | 說明 | 關鍵點 |
|---|---|---|
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() | 獲取名/值 |
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);
String header = String.format("%s=%s; Path=/; Domain=%s; Max-Age=%d; Secure; HttpOnly",
cookieName, cookieValue, domain, maxAge);
response.addHeader("Set-Cookie", header);
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("RMKEY".equals(c.getName())) {
String value = c.getValue(); // 取值
break;
}
}
}
setMaxAge()。Domain=.example.com:a.example.com、b.example.com 皆可見。Path=/:全站路徑可見;Path=/app:僅 /app/* 可見。document.cookie,防 XSS 盜取 Session ID。SameSite=Strict:完全禁止跨站攜帶。SameSite=Lax:允許鏈接跳轉攜帶(默認)。SameSite=None; Secure:跨站攜帶,需 HTTPS。response.addHeader("Set-Cookie", "name=val; SameSite=Lax")。Cookie remember = new Cookie("rememberMe", token);
remember.setMaxAge(7 * 24 * 3600); // 7天
remember.setPath("/");
remember.setHttpOnly(true);
remember.setSecure(true);
response.addCookie(remember);
setDomain(".parent.com")HttpOnlySecureMax-Age,避免永久有效Domain/Path 遵循最小權限Cookie 是 Web 狀態管理的基石。掌握 Cookie 類 API、Max-Age/Domain/Path/Secure/HttpOnly/SameSite 六大屬性的組合策略,能構建安全、可控、高性能的會話體驗。現代開發建議:核心會話用 Server-Side Session + Cookie 存 SessionID,業務狀態用 LocalStorage/IndexedDB,Cookie 僅承擔身份標識傳遞。