一、什么是 Cookie

Cookie 是 HTTP 协议中一种在客户端(浏览器)保存少量状态信息的机制。由于 HTTP 协议本身是无状态的,服务器无法区分不同请求是否来自同一用户,Cookie 正是为了解决这一问题而产生的。

工作流程如下:

  • 用户首次访问服务器,服务器在响应头中通过 Set-Cookie 发送 Cookie 数据。
  • 浏览器将 Cookie 保存到本地(内存或磁盘)。
  • 此后每次请求同域资源,浏览器自动在请求头中携带 Cookie。
  • 服务器读取 Cookie,识别用户身份或偏好,返回个性化内容。

💡 提示

Cookie 存储在客户端,用户可以查看和修改,因此不应在 Cookie 中存储敏感信息(如密码、权限标志)。

二、Cookie 核心属性

Java Servlet API 中,Cookie 类封装了所有属性,以下是完整说明:

属性名

类型

默认值

说明

name

String

(必填)

Cookie 名称,创建后不可更改

value

String

(必填)

Cookie 的值,不支持中文,需 URL 编码

maxAge

int

-1

-1=会话级; 0=立即删除; >0=秒数

path

String

当前路径

生效路径,/表示整站有效

domain

String

当前域名

.example.com 可跨子域共享

secure

boolean

false

为 true 时只在 HTTPS 下传输

httpOnly

boolean

false

为 true 时禁止 JS 读取,防 XSS

sameSite

String

Lax

控制跨站请求是否携带(Strict/Lax/None)

三、Cookie 基本操作

3.1 创建并发送 Cookie

// 1. 创建 Cookie 对象

Cookie cookie = new Cookie("username", "zhangsan");

// 2. 设置属性

cookie.setMaxAge(60 * 60 * 24);   // 有效期 1 天

cookie.setPath("/");               // 全站有效

cookie.setHttpOnly(true);          // 防止 JS 读取

cookie.setSecure(false);           // 开发环境用 HTTP

// 3. 写入响应(发送给浏览器)

response.addCookie(cookie);

3.2 读取 Cookie

Cookie[] cookies = request.getCookies();

if (cookies != null) {

    for (Cookie c : cookies) {

        if ("username".equals(c.getName())) {

            String val = c.getValue();

            System.out.println("用户名: " + val);

        }

    }

}

3.3 修改 Cookie

Cookie 没有直接修改方法,重新发送同名 Cookie 即可覆盖(name 和 path 必须相同):

// 同名 Cookie 覆盖原值

Cookie cookie = new Cookie("username", "lisi");

cookie.setMaxAge(60 * 60 * 24);

cookie.setPath("/");

response.addCookie(cookie);

3.4 删除 Cookie

// 将 maxAge 设为 0,路径必须与原 Cookie 一致

Cookie cookie = new Cookie("username", "");

cookie.setMaxAge(0);

cookie.setPath("/");

response.addCookie(cookie);

3.5 中文值处理

// 写入时编码

String encoded = URLEncoder.encode("张三", "UTF-8");

Cookie cookie = new Cookie("username", encoded);

response.addCookie(cookie);



// 读取时解码

String value = URLDecoder.decode(cookie.getValue(), "UTF-8");

四、Cookie vs Session 对比

对比项

Cookie

Session

存储位置

客户端浏览器(本地文件/内存)

服务器端内存或数据库

安全性

较低,用户可查看/篡改

较高,数据在服务器

存储大小

≤ 4KB / 每个域名

理论无限制(受服务器内存)

生命周期

可持久化,maxAge 控制

默认 30 分钟,可自定义

跨浏览器

不跨浏览器共享

不跨浏览器(依赖 Session ID)

典型用途

记住用户名、偏好设置、Token

登录状态、购物车、权限校验

依赖

不依赖服务器状态

依赖 Session ID Cookie

⚠️  安全建议

实际项目中,Cookie 只存 SessionID(JSESSIONID),敏感权限数据存 Session。如使用 JWT,Token 也应设置 HttpOnly + Secure 后存入 Cookie,而非 localStorage。

五、IntelliJ IDEA 完整演示项目

5.1 项目结构

cookie-demo/

├── pom.xml                          ← Maven 配置

├── src/main/

│   ├── java/com/example/cookie/

│   │   ├── SetCookieServlet.java    ← 设置 Cookie

│   │   ├── GetCookieServlet.java    ← 读取 Cookie

│   │   └── DeleteCookieServlet.java ← 删除 Cookie

│   └── webapp/

│       ├── WEB-INF/web.xml          ← Servlet 配置

│       └── index.jsp                ← 演示首页

└── (IDEA 自动生成 .idea/ 等目录)

5.2 环境要求

  • IntelliJ IDEA 2022+ (Community 或 Ultimate 均可)
  • JDK 8 或以上版本
  • Apache Tomcat 9.x(IDEA 内配置或本地安装)
  • Maven 3.6+(IDEA 内置即可)

5.3 pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

         http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>

    <artifactId>cookie-demo</artifactId>

    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>



    <dependencies>

        <dependency>

            <groupId>javax.servlet</groupId>

            <artifactId>javax.servlet-api</artifactId>

            <version>4.0.1</version>

            <scope>provided</scope>

        </dependency>

    </dependencies>

</project>

5.4 SetCookieServlet.java

package com.example.cookie;



import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.annotation.WebServlet;

import java.io.*;

import java.net.URLEncoder;



@WebServlet("/setCookie")

public class SetCookieServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {



        resp.setContentType("text/html;charset=UTF-8");



        // 1. 普通 Cookie(会话级)

        Cookie session = new Cookie("sessionUser", "guest");

        session.setPath("/");

        resp.addCookie(session);



        // 2. 持久 Cookie(7天)

        String name = URLEncoder.encode("张三", "UTF-8");

        Cookie persist = new Cookie("rememberedUser", name);

        persist.setMaxAge(60 * 60 * 24 * 7);

        persist.setPath("/");

        persist.setHttpOnly(true);

        resp.addCookie(persist);



        PrintWriter out = resp.getWriter();

        out.println("<h2>✅ Cookie 已设置!</h2>");

        out.println("<p>sessionUser = guest (会话级)</p>");

        out.println("<p>rememberedUser = 张三(持久7天)</p>");

        out.println("<a href='/cookie-demo/getCookie'>→ 查看 Cookie</a>");

    }

}

5.5 GetCookieServlet.java

package com.example.cookie;



import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.annotation.WebServlet;

import java.io.*;

import java.net.URLDecoder;



@WebServlet("/getCookie")

public class GetCookieServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {



        resp.setContentType("text/html;charset=UTF-8");

        PrintWriter out = resp.getWriter();

        out.println("<h2>📋 当前所有 Cookie</h2>");

        out.println("<table border='1' cellpadding='6'>");

        out.println("<tr><th>名称</th><th>值</th><th>MaxAge</th></tr>");



        Cookie[] cookies = req.getCookies();

        if (cookies != null) {

            for (Cookie c : cookies) {

                String val = c.getValue();

                // 尝试 URL 解码

                try { val = URLDecoder.decode(val, "UTF-8"); }

                catch (Exception ignored) {}

                out.printf("<tr><td>%s</td><td>%s</td><td>%d</td></tr>%n",

                    c.getName(), val, c.getMaxAge());

            }

        } else {

            out.println("<tr><td colspan='3'>暂无 Cookie</td></tr>");

        }

        out.println("</table>");

        out.println("<br><a href='/cookie-demo/deleteCookie'>→ 删除持久 Cookie</a>");

    }

}

5.6 DeleteCookieServlet.java

package com.example.cookie;



import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.annotation.WebServlet;

import java.io.*;



@WebServlet("/deleteCookie")

public class DeleteCookieServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {



        resp.setContentType("text/html;charset=UTF-8");



        // maxAge=0 且 path 与原 Cookie 相同 → 删除

        Cookie del = new Cookie("rememberedUser", "");

        del.setMaxAge(0);

        del.setPath("/");

        resp.addCookie(del);



        PrintWriter out = resp.getWriter();

        out.println("<h2>🗑️ 持久 Cookie 已删除!</h2>");

        out.println("<a href='/cookie-demo/getCookie'>→ 验证删除结果</a>");

    }

}

5.7 WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

         version="4.0">

    <display-name>Cookie Demo</display-name>

    <!-- 使用 @WebServlet 注解时,此文件可留空 -->

</web-app>

5.8 index.jsp(演示首页)

<%@ page contentType="text/html;charset=UTF-8" %>

<html>

<head><title>Cookie 演示</title></head>

<body>

  <h1>Java Web Cookie 演示</h1>

  <ul>

    <li><a href='setCookie'>① 设置 Cookie</a></li>

    <li><a href='getCookie'>② 读取 Cookie</a></li>

    <li><a href='deleteCookie'>③ 删除 Cookie</a></li>

  </ul>

</body>

</html>

六、在 IDEA 中运行步骤

Step 1 — 创建项目

  • 打开 IDEA → File → New → Project → Maven Archetype
  • 选择 maven-archetype-webapp,填写 GroupId: com.example,ArtifactId: cookie-demo
  • 等待 Maven 下载依赖完成

Step 2 — 添加代码

  • 将 pom.xml 内容替换为 5.3 节所示内容
  • 在 src/main/java 下创建包 com.example.cookie
  • 依次创建 SetCookieServlet.java、GetCookieServlet.java、DeleteCookieServlet.java
  • 替换 src/main/webapp/index.jsp 为 5.8 节内容

Step 3 — 配置 Tomcat

  • Run → Edit Configurations → 点击 + → Tomcat Server → Local
  • 在 Server 标签页选择本地 Tomcat 安装路径
  • 切换到 Deployment 标签页 → 点击 + → Artifact → 选择 cookie-demo:war exploded
  • Application context 设置为 /cookie-demo

Step 4 — 启动并测试

  • 点击绿色运行按钮,浏览器会自动打开 http://localhost:8080/cookie-demo/
  • 依次点击三个链接:设置 → 读取 → 删除,观察 Cookie 变化
  • 可按 F12 打开开发者工具 → Application → Cookies 实时查看

🔍 调试建议

在浏览器 DevTools → Network 中查看请求头 Cookie 字段和响应头 Set-Cookie 字段,可直观观察 Cookie 的传输过程。

七、安全最佳实践

  • 始终设置 HttpOnly = true,防止 XSS 攻击通过 JS 窃取 Cookie。
  • 生产环境使用 HTTPS,并设置 Secure = true,防止中间人攻击。
  • 使用 SameSite=Strict 或 Lax,防止 CSRF 跨站请求伪造。
  • 不在 Cookie 中存储明文密码、权限标志等敏感字段。
  • Cookie 值应为随机不可预测的 Token(如 UUID),而非用户 ID 明文。
  • 定期轮换 Cookie 值(如用户权限变更时立即失效旧 Cookie)。

推荐方案

Cookie 只存 SessionID(或 JWT Token),服务端 Session 存权限数据;JWT 模式下将 Token 放入 HttpOnly Cookie,而非 localStorage,可防 XSS。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐