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

Spring MVC 中 Cookie 完整操作指南:新增、讀取、修改、刪除與封裝工具類

     編輯:Java 相關知識

核心 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;
                }
            }
        }
    }
}

關鍵注意事項

  1. 讀取時:瀏覽器只傳送 name、value;maxAge、path、domain 等屬性不可讀。
  2. 修改/刪除時:新建的 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 名稱常數,避免拼寫錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved