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

所有评论(0)