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

Java 中 Cookie 操作完整指南:設定、讀取、刪除與路徑管理

     編輯:關於JSP

前言

Cookie 是 Web 開發中實現會話追蹤、用戶識別的核心機制之一。在 Java Web 開發中,javax.servlet.http.Cookie 類提供了完整的操作 API。本文將系統整理 Cookie 的建立、讀取、刪除以及路徑、生命週期等關鍵細節,並附上完整範例代碼,幫助開發者避開常見陷阱。

一、設定 Cookie

1. 基本建立

Cookie cookie = new Cookie("key", "value");

構造函數接收鍵值對,值不支援中文或特殊字符,需自行編碼(如 URLEncoder.encode)。

2. 設定生命週期 setMaxAge(int seconds)

  • 正值:持久化 Cookie,單位為秒,瀏覽器會寫入硬碟。
  • 負值(預設 -1):會話級 Cookie,僅存在於瀏覽器記憶體中,關閉瀏覽器即失效。
  • 0:立即刪除該 Cookie。
cookie.setMaxAge(60); // 60 秒後過期

3. 設定作用路徑 setPath(String path)

cookie.setPath("/test/test2");
  • 路徑決定 Cookie 隨請求發送的 URL 範圍。
  • 未設定時預為當前 Servlet 的映射路徑(request.getContextPath() + url-pattern)。
  • 父路徑可讀取子路徑的 Cookie,子路徑不可讀取父路徑未共享的 Cookie。

4. 寫入回應

response.addCookie(cookie);

二、讀取 Cookie

Cookie[] cookies = request.getCookies();
  • 返回當前路徑及直接父路徑下所有可見 Cookie。
  • 若無 Cookie 則返回 null,需做非空判斷。
  • 遍歷數組以 getName()/getValue() 取值。

三、刪除 Cookie

刪除本質是建立同名、同路徑、MaxAge=0 的 Cookie 覆蓋:

Cookie cookie = new Cookie("key", null);
cookie.setMaxAge(0);
cookie.setPath("/test/test2"); // 必須與建立時路徑一致
response.addCookie(cookie);

關鍵點:路徑、名稱大小寫必須完全一致,否則無法刪除。

四、完整 JSP 範例:記住用戶名

cindex.jsp - 顯示頁面

<%@ page contentType="text/html; charset=utf-8" %>
<html><body>
<%
    String username = null;
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie c : cookies) {
            if ("cookies_user".equals(c.getName())) {
                username = c.getValue();
                break;
            }
        }
    }
    if ("onepc".equals(username)) {
        out.println("Hello");
    } else {
%>
    <form method="post" action="clogin.jsp">
        用戶名:<input type="text" name="user" /><br/>
        過期時間:
        <select name="expire">
            <option value="31536000">一年</option>
            <option value="120">兩分鐘</option>
        </select><br/>
        <input type="submit" value="登入" />
    </form>
<% } %>
</body></html>

clogin.jsp - 處理登入並寫入 Cookie

<%
    String user = request.getParameter("user");
    String expire = request.getParameter("expire");
    Cookie cookie = new Cookie("cookies_user", user);
    cookie.setMaxAge(Integer.parseInt(expire));
    response.addCookie(cookie);
    response.sendRedirect("cindex.jsp");
%>

五、路徑機制深度解析(避坑指南)

假設路徑結構:/test/test2/test345/test555/test666

  1. 同名 Cookie 可共存於不同路徑,值可同可不同。
  2. 刪除規則:
    • 若當前路徑無同名 Cookie,向上查找最近父路徑並刪除(每次僅刪一個)。
    • Firefox:必須指定建立時的完整路徑,名稱大小寫敏感。
    • IE:名稱全小寫時會向上遞歸查找(/test/test2 → /test → /);名稱含大寫或混合大小寫時不向上查找,僅刪當前路徑。
  3. 讀取規則:僅能讀取直接父路徑鏈(/test/test2 → /test → /),不可跨層級。
  4. 多 Web 應用共存:同域名下不同 ContextPath(如 /app1、/app2)切勿設定 Path=/,否則 Cookie 會互相干擾。

六、最佳實踐總結

  • 敏感資料勿存 Cookie,僅存識別 Token。
  • 設定 HttpOnly、Secure(HTTPS)屬性防 XSS/竊聽(Servlet 3.0+ 支援 cookie.setHttpOnly(true))。
  • 統一使用 UTF-8 編碼值:URLEncoder.encode(value, "UTF-8") / URLDecoder.decode。
  • 刪除時務必複製原建立參數(名稱、路徑、Domain)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved