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

JSP 與 Cookie 完整操作指南:寫入、讀取、屬性設定與相容性陷阱

     編輯:關於JSP

    Cookie 基本概念

    Cookie 是伺服器發送至瀏覽器的小型文字資料,瀏覽器儲存後後續請求自動攜帶,實現 HTTP 無狀態協議下的狀態保持(如登入態、偏好設定、追蹤 ID)。

    一、寫入 Cookie

    <%@ page contentType="text/html; charset=UTF-8" %>
    <%
        // 1. 建立 Cookie(名稱、值)
        Cookie cookie = new Cookie("username", "JohnDoe");
    
        // 2. 設定屬性
        cookie.setMaxAge(60 * 60 * 24 * 30); // 存活 30 天(秒),負數=會話級,0=刪除
        cookie.setPath("/");                 // 生效路徑,預設為當前路徑
        cookie.setDomain(".example.com");    // 跨子域共享(可選)
        cookie.setSecure(true);              // 僅 HTTPS 傳輸(可選)
        cookie.setHttpOnly(true);            // 防止 JS 存取,防 XSS(Servlet 3.0+)
    
        // 3. 寫入回應
        response.addCookie(cookie);
    %>
    <html><body>Cookie 已寫入</body></html>
    

    二、讀取 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>");
                // 依名稱取值
                if ("username".equals(name)) {
                    // 取得目標 Cookie
                }
            }
        }
    %>
    

    三、常見屬性詳細說明

    屬性方法說明
    名稱建構子不可變,建立時指定
    值getValue/setValue儲存資料,建議 URL 編碼
    MaxAgesetMaxAge(int 秒)>0 持久化;=0 刪除;<0 會話級(關閉瀏覽器失效)
    PathsetPath(String)URL 路徑前綴匹配,預設為建立 Cookie 的路徑
    DomainsetDomain(String)跨子域共享,如 .example.com 覆蓋 a.example.com
    SecuresetSecure(boolean)僅 HTTPS 傳輸
    HttpOnlysetHttpOnly(boolean)禁止 JavaScript 存取,降低 XSS 風險

    四、版本相容性陷阱

    • Version 0 (Netscape):幾乎所有瀏覽器支援,Java javax.servlet.http.Cookie 只支援此版本。
    • Version 1 (RFC 2109):支援 Comment、Port、Max-Age 等擴展,但 Java 標準 API 不支援,需手寫 Header 處理。
    • 字元限制:V0 值不可含空格、分號、逗號、等號、括號、引號、斜線、@、冒號等。建議儲存前 URLEncoder.encode(value, "UTF-8"),讀取後 URLDecoder.decode。

    五、實用工具類

    public final class CookieUtils {
        public static void addCookie(HttpServletResponse resp, String name, String value,
                                     int maxAge, String path, String domain, boolean secure, boolean httpOnly) {
            Cookie c = new Cookie(name, value);
            c.setMaxAge(maxAge);
            if (path != null) c.setPath(path);
            if (domain != null) c.setDomain(domain);
            c.setSecure(secure);
            c.setHttpOnly(httpOnly);
            resp.addCookie(c);
        }
    
        public static String getCookie(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 removeCookie(HttpServletResponse resp, String name, String path, String domain) {
            addCookie(resp, name, "", 0, path, domain, false, false);
        }
    }
    

    六、安全最佳實踐

    1. 敏感 Cookie 必設 Secure=true; HttpOnly=true。
    2. Session ID Cookie 設 Path=/; HttpOnly=true。
    3. 避免在 Cookie 存放敏感明文(權限、金額),改存加密 Token 對應伺服端 Session/Redis。
    4. 定期輪換 Cookie 名稱/值,降低竊取風險。
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved