本文目录导读:

在 Java Web 开发中,Cookie 是用于在客户端(浏览器)存储少量数据的机制,通常通过 javax.servlet.http.Cookie 类和 HttpServletRequest/HttpServletResponse 对象进行操作。
以下是一个完整的 Java Servlet 案例,演示如何写入和读取 Cookie 数据。
写入 Cookie(服务端发送给客户端)
步骤:
- 创建
Cookie对象(键值对)。 - 设置属性(过期时间、路径、域名等)。
- 通过
response.addCookie()发送给浏览器。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/writeCookie")
public class WriteCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1. 创建 Cookie 对象 (键: username, 值: Jack)
Cookie usernameCookie = new Cookie("username", "Jack");
// 2. 设置 Cookie 的有效期(单位:秒)
// 正数:过期时间(秒),负数:仅本次会话有效,0:立即删除
usernameCookie.setMaxAge(60 * 60); // 1小时后过期
// 3. 设置 Cookie 的访问路径(可选,默认是当前应用的根路径)
// 只有访问该路径下的资源时才会携带此 Cookie
usernameCookie.setPath("/");
// 4. 设置域名(可选,用于跨子域共享 Cookie)
// usernameCookie.setDomain(".example.com");
// 5. 设置 HttpOnly(防止 XSS 攻击时被 JS 读取,增强安全性)
usernameCookie.setHttpOnly(true);
// 6. 将 Cookie 添加到响应中
resp.addCookie(usernameCookie);
// 7. 给客户端返回提示
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("Cookie 已写入!");
}
}
读取 Cookie(服务端从客户端请求中获取)
步骤:
- 通过
request.getCookies()获取所有 Cookie 数组。 - 遍历数组,根据名称查找目标 Cookie。
- 使用
cookie.getValue()获取值。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/readCookie")
public class ReadCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String username = null;
// 1. 获取请求中携带的所有 Cookie
Cookie[] cookies = req.getCookies();
if (cookies != null) {
// 2. 遍历 Cookie 数组,查找名为 "username" 的 Cookie
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
break; // 找到后退出循环
}
}
}
// 3. 根据结果返回响应
resp.setContentType("text/html;charset=UTF-8");
if (username != null) {
resp.getWriter().write("读取到的 username: " + username);
} else {
resp.getWriter().write("未找到 username Cookie(可能已过期或未设置)");
}
}
}
删除 Cookie
删除 Cookie 通常通过设置 MaxAge 为 0 来实现(注意路径必须与设置时一致):
Cookie deleteCookie = new Cookie("username", "");
deleteCookie.setMaxAge(0); // 立即过期
deleteCookie.setPath("/"); // 路径必须与写入时相同
resp.addCookie(deleteCookie);
完整测试流程(使用浏览器或 Postman)
-
访问写入接口
浏览器访问:http://localhost:8080/你的项目名/writeCookie
服务端发送一个名为username、值为Jack、有效期1小时的 Cookie。 -
访问读取接口
浏览器访问:http://localhost:8080/你的项目名/readCookie
服务端从请求中解析 Cookie,输出读取到的 username: Jack。
重要注意事项
| 要点 | 说明 |
|---|---|
| 大小限制 | 单个 Cookie 不超过 4KB,每个域名下最多约 50 个 Cookie。 |
| 安全敏感数据 | 不要存放密码、Token 等敏感信息(除非使用 HTTPS + Secure 标记)。 |
| 编码问题 | 如果值包含中文或特殊字符,建议使用 URLEncoder.encode() / URLDecoder.decode() 进行编码/解码。 |
| HttpOnly | 设置为 true 可防止 JavaScript 通过 document.cookie 读取,降低 XSS 攻击风险。 |
| 跨域问题 | 默认情况下,Cookie 不会跨域传递,需设置 Domain 和 SameSite 属性。 |
中文值编码示例(避免乱码)
// 写入时编码
String chineseValue = "张三";
Cookie cookie = new Cookie("username", URLEncoder.encode(chineseValue, "UTF-8"));
cookie.setMaxAge(3600);
resp.addCookie(cookie);
// 读取时解码
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("username".equals(c.getName())) {
String decodedValue = URLDecoder.decode(c.getValue(), "UTF-8");
// 使用 decodedValue
}
}
}
- 写入:
new Cookie(键, 值)→setMaxAge()→response.addCookie() - 读取:
request.getCookies()→ 遍历匹配 →cookie.getValue() - 删除:新建同名 Cookie 且
MaxAge=0,路径一致即可清除。