Cookie 是 Web 開發中常用的客戶端狀態管理機制,Java Servlet API 提供了原生的 Cookie 類別來處理 Cookie 的讀寫操作。本文將詳細說明如何在 Java 中建立、寫入與讀取 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 衝突。從請求中取得 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 提早結束迴圈,避免不必要的遍歷。@CookieValue 註解簡化參數綁定。cookie.setHttpOnly(true) 防止 JavaScript 存取,降低 XSS 風險。cookie.setSecure(true)。Java 原生 Cookie API 簡單易用,適合輕量級狀態儲存。實際專案中建議封裝工具類統一管理 Cookie 的建立、加密、驗證與刪除邏輯,並結合 Session、JWT 等技術根據業務場景選擇最適合的狀態管理方案。