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

Java 讀寫 Cookie 完整指南與程式碼範例

     編輯:Java 相關知識

前言

Cookie 是 Web 開發中常用的客戶端狀態管理機制,Java Servlet API 提供了原生的 Cookie 類別來處理 Cookie 的讀寫操作。本文將詳細說明如何在 Java 中建立、寫入與讀取 Cookie,並提供實用的程式碼範例供開發者參考。

寫入 Cookie

建立 Cookie 物件時需指定名稱與值,值可以是字串、列表、Map 或整數等經過序列化的資料。透過 setMaxAge() 設定存活時間(秒),再呼叫 response.addCookie() 將 Cookie 寫入 HTTP 回應標頭。

// 寫入用戶名 Cookie(帶學校 ID 前綴避免衝突)
Cookie usernameCookie = new Cookie("username_" + schoolId, encodedUsername);
usernameCookie.setMaxAge(60 * 60 * 24 * 365); // 存活一年
response.addCookie(usernameCookie);

// 寫入用戶 ID Cookie(用於推薦課程等個性化功能)
Cookie userIdCookie = new Cookie("userId_" + schoolId, userId);
userIdCookie.setMaxAge(60 * 60 * 24 * 365);
response.addCookie(userIdCookie);

關鍵點說明:

  • setMaxAge(60 * 60 * 24 * 365):設定 Cookie 有效期為 365 天;若設為 0 表示刪除 Cookie,負數則為會話級 Cookie(瀏覽器關閉即失效)。
  • 名稱加入 schoolId 前綴,可避免多租戶系統中不同學校的 Cookie 衝突。
  • 敏感資料(如 userId)建議加密或使用簽名後再存入 Cookie。

讀取 Cookie

從請求中取得 Cookie 陣列,遍歷比對名稱以獲取目標值。以下範例展示如何在 Spring 環境下透過 RequestContextHolder 取得請求並讀取 Cookie。

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String userId = null;
Cookie[] cookies = request.getCookies();

if (cookies != null) {
    for (Cookie cookieTemp : cookies) {
        String cookieName = cookieTemp.getName();
        // 查找特定前綴的 userId Cookie
        if (cookieName.equals("userId_" + schoolId)) {
            userId = cookieTemp.getValue();
            break; // 找到即跳出迴圈,提升效能
        }
    }
}

最佳實務建議:

  • 檢查 cookies != null 避免空指標異常。
  • 使用 break 提早結束迴圈,避免不必要的遍歷。
  • 若專案使用 Spring,可考慮使用 @CookieValue 註解簡化參數綁定。

安全性考量

  • **HttpOnly**:透過 cookie.setHttpOnly(true) 防止 JavaScript 存取,降低 XSS 風險。
  • **Secure**:僅在 HTTPS 傳輸時發送 Cookie,設定 cookie.setSecure(true)。
  • **SameSite**:現代瀏覽器支援 SameSite 屬性(需 Servlet 容器支援或手動設定 Header),可防禦 CSRF 攻擊。

總結

Java 原生 Cookie API 簡單易用,適合輕量級狀態儲存。實際專案中建議封裝工具類統一管理 Cookie 的建立、加密、驗證與刪除邏輯,並結合 Session、JWT 等技術根據業務場景選擇最適合的狀態管理方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved