核心 Controller 程式碼
@Controller
@RequestMapping("/cookie")
public class CookieController {
/** 讀取所有 Cookie */
@GetMapping("/show")
@ResponseBody
public void showCookies(HttpServletRequest req, HttpServletResponse resp) {
Cookie[] cookies = req.getCookies();
if (cookies == null) {
System.out.println("無 Cookie");
} else {
for (Cookie c : cookies) {
System.out.printf("name=%s, value=%s%n", c.getName(), c.getValue());
}
}
}
/** 新增 Cookie */
@GetMapping("/add")
@ResponseBody
public void addCookie(HttpServletResponse resp,
@RequestParam String name, @RequestParam String value) {
Cookie c = new Cookie(name.trim(), value.trim());
c.setMaxAge(30 * 60); // 30 分鐘
c.setPath("/");
resp.addCookie(c);
System.out.println("已新增 Cookie");
}
/** 修改 Cookie:需同名、同 path、同 domain 才會覆蓋 */
@GetMapping("/edit")
@ResponseBody
public void editCookie(HttpServletRequest req, HttpServletResponse resp,
@RequestParam String name, @RequestParam String value) {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if (c.getName().equals(name)) {
c.setValue(value);
c.setPath("/");
c.setMaxAge(30 * 60);
resp.addCookie(c);
System.out.printf("已修改 %s = %s%n", name, value);
break;
}
}
}
}
/** 刪除 Cookie:設定 MaxAge=0 立即銷毀 */
@GetMapping("/delete")
@ResponseBody
public void deleteCookie(HttpServletRequest req, HttpServletResponse resp,
@RequestParam String name) {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if (c.getName().equals(name)) {
c.setValue(null);
c.setMaxAge(0);
c.setPath("/");
resp.addCookie(c);
System.out.println("已刪除 " + name);
break;
}
}
}
}
}
關鍵注意事項
- 讀取時:瀏覽器只傳送
name、value;maxAge、path、domain 等屬性不可讀。
- 修改/刪除時:新建的 Cookie 除
value/maxAge 外,name、path、domain 必須與原 Cookie 完全一致,否則瀏覽器視為不同 Cookie,導致修改/刪除失效。
實用封裝工具方法
/** 依名稱取得 Cookie,不存在回傳 null */
public Cookie getCookieByName(HttpServletRequest req, String name) {
return readCookieMap(req).get(name);
}
/** 將 Cookie 陣列轉為 Map 便於查找 */
private Map<String, Cookie> readCookieMap(HttpServletRequest req) {
Map<String, Cookie> map = new HashMap<>();
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) map.put(c.getName(), c);
}
return map;
}
最佳實踐建議
- 敏感資料勿存 Cookie,改用 Session / JWT。
- 設定
HttpOnly、Secure(HTTPS)、SameSite 屬性提升安全性(Servlet 3.0+ 支援)。
- 統一管理 Cookie 名稱常數,避免拼寫錯誤。