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

Java Web 開發必備:Cookie 完整操作指南與跨瀏覽器坑點避雷

     編輯:Java 程式設計入門

核心 API 快速參考

路徑匹配機制深度解析

假設路徑結構:/ → /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 隔離

常見陷阱總結

  1. 忘記 response.addCookie() 導致不生效
  2. 刪除時路徑不匹配導致殘留
  3. 中文值未 URL 編碼導致亂碼(需 URLEncoder.encode/URLDecoder.decode)
  4. 假設 getCookies() 不為 null 直接遍歷導致 NPE
  5. 忽視瀏覽器大小寫/路徑查找差異

代碼模板:通用工具類


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);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作關鍵代碼說明
創建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()需與創建時同名、同路徑