| 操作 | 關鍵代碼 | 說明 |
| 創建 | new Cookie(name, value) | 名值對均為 String |
| 設置生存期 | setMaxAge(seconds) | >0 持久化;=0 立即刪除;<0 會話級(瀏覽器關閉失效) |
| 設置路徑 | setPath(path) | 默認當前 Servlet 路徑,建議顯式指定 |
| 寫入響應 | response.addCookie(cookie) | 必須調用才生效 |
| 讀取 | request.getCookies() | 返回數組,無則為 null;含當前路徑及直接父路徑 Cookie |
| 刪除 | new Cookie(name, null); setMaxAge(0); setPath(...); response.addCookie() | 需與創建時同名、同路徑 |
路徑匹配機制深度解析
假設路徑結構:/ → /test → /test/test2,/test345,/test555/test666
- 同名 Cookie 可共存於不同路徑
- 讀取:當前路徑 → 直接父路徑(
/test)→ 根路徑(/),不會跨分支(如 /test555)
- 刪除:必須指定創建時的確切路徑。瀏覽器差異巨大:
- Firefox:不區分大小寫,會向上查找父路徑
- IE:鍵名小寫時向上查找;大寫/混合大小寫僅刪除當前路徑,不向上查找
多 Web 應用(Context)環境下的最佳實踐
Tomcat/Jetty 以 Context 隔離應用,各有獨立 path。若多應用部署在同域名下:
- 嚴禁設置
setPath(\"/\"):會導致 Cookie 跨應用洩露、衝突、誤刪除
- 每個應用使用各自的 Context Path(如
/app1, /app2)作為 Cookie Path
- 若需跨應用共享,改用同域名下的
Domain 屬性 + 統一認證中心(SSO),而非依賴 Path 隔離
常見陷阱總結
- 忘記
response.addCookie() 導致不生效
- 刪除時路徑不匹配導致殘留
- 中文值未 URL 編碼導致亂碼(需
URLEncoder.encode/URLDecoder.decode)
- 假設
getCookies() 不為 null 直接遍歷導致 NPE
- 忽視瀏覽器大小寫/路徑查找差異
代碼模板:通用工具類
public class CookieUtil {
public static void add(HttpServletResponse resp, String name, String value, int maxAge, String path) {
Cookie c = new Cookie(name, value);
c.setMaxAge(maxAge);
c.setPath(path);
resp.addCookie(c);
}
public static String get(HttpServletRequest req, String name) {
Cookie[] cs = req.getCookies();
if (cs != null) for (Cookie c : cs) if (name.equals(c.getName())) return c.getValue();
return null;
}
public static void remove(HttpServletResponse resp, String name, String path) {
add(resp, name, null, 0, path);
}
}
- 上一篇文章: Java 多態機制深度解析:方法重寫與介面契約的雙重保障
- 下一篇文章: Java 串口通訊開發指南:基於 Java Communications API 的 RS232 實戰
Copyright ©
程式碼之家 All Rights Reserved