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

JSP 操作 Cookie 完全指南:寫入、讀取、屬性設置與兼容性避坑

     編輯:關於JSP

前言

Cookie 是 HTTP 無狀態協議下識別用戶的經典方案。雖然現代 Web 有 localStorage、SessionStorage、JWT 等新選擇,但 Cookie 仍是跨域單點登入、記住登入、追蹤分析的基石。本文以 JSP 為例,系統講解 Cookie 全生命週期操作。

一、寫入 Cookie

<%
    String cookieName = "Sender";
    Cookie cookie = new Cookie(cookieName, "Test_Content");
    cookie.setMaxAge(10);                    // 10 秒過期
    // cookie.setMaxAge(365*24*60*60);      // 一年過期
    response.addCookie(cookie);
%>

關鍵點解析

  • 構造函數:new Cookie(name, value),名稱值皆為 String,值不可含空格、分號、逗號、等號、括號、@ 等特殊字符(Version 0 規範)。
  • setMaxAge(int 秒):
    • >0:持久化到硬碟,指定秒數後過期。
    • =0:立即刪除(配合同名同路徑)。
    • <0:會話級,瀏覽器關閉即失效(預設)。
  • setPath(String):指定 Cookie 隨請求發送的 URL 前綴,預設為當前 Servlet 映射路徑。
  • setDomain(String):跨子域共享時設置(如 .example.com)。
  • setSecure(true):僅 HTTPS 傳輸。
  • setHttpOnly(true):防 JS 讀取(Servlet 3.0+),緩解 XSS。

二、讀取 Cookie

<%
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie c : cookies) {
            String name = c.getName();
            String value = c.getValue();
            out.println("Name: " + name + ", Value: " + value + "<br/>");
        }
    }
%>
  • request.getCookies() 返回當前路徑及父路徑所有有效 Cookie 數組,無則返回 null。
  • 遍歷數組取名值,後續可存入 Map 或直接業務判斷。

三、常見問題與最佳實踐

1. 版本兼容性

  • Version 0 (Netscape):幾乎所有瀏覽器支援,Java javax.servlet.http.Cookie 僅支援此版本。
  • Version 1 (RFC 2109):放寬字符限制,但 Java 標準庫不支援,生產環境請勿依賴。

2. 字符編碼陷阱

Cookie 值僅支援 ASCII 可打印字符(Version 0)。中文、特殊符號必須編碼:

// 寫入
String encoded = URLEncoder.encode("中文值", "UTF-8");
Cookie c = new Cookie("key", encoded);

// 讀取
String decoded = URLDecoder.decode(c.getValue(), "UTF-8");

3. 路徑與域名精準控制

  • 刪除/更新 Cookie 時,name、path、domain 必須與建立時完全一致。
  • 多 Web 應用同主域名下,避免使用 path=/ 造成互相污染。

4. 安全屬性(生產環境必開)

cookie.setSecure(true);      // 僅 HTTPS
cookie.setHttpOnly(true);    // 防 XSS 竊取
// cookie.setSameSite("Strict"); // Servlet 5.0+ (Jakarta EE 9+) 支援 SameSite

四、完整示例:記住用戶名(含編碼)

<%@ page import="java.net.URLEncoder, java.net.URLDecoder" %>
<%
    // 寫入
    String username = request.getParameter("username");
    if (username != null) {
        Cookie c = new Cookie("remember_user", URLEncoder.encode(username, "UTF-8"));
        c.setMaxAge(30*24*60*60); // 30 天
        c.setPath(request.getContextPath());
        c.setHttpOnly(true);
        response.addCookie(c);
    }

    // 讀取回顯
    String saved = "";
    Cookie[] cs = request.getCookies();
    if (cs != null) {
        for (Cookie c : cs) {
            if ("remember_user".equals(c.getName())) {
                saved = URLDecoder.decode(c.getValue(), "UTF-8");
                break;
            }
        }
    }
%>
<input type="text" name="username" value="<%=saved%>" />

五、總結

  1. Cookie 寫入靠 response.addCookie,讀取靠 request.getCookies。
  2. 生命週期由 setMaxAge 決定,0 刪除,負數會話級。
  3. 值必須 URL 編碼,屬性(路徑、域、安全標誌)需精準設置。
  4. 敏感數據勿存 Cookie,僅存識別 Token;重要操作驗證 Session/資料庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved