在 Web 开发中,HTTP 是无状态协议——每次请求彼此独立,服务器无法“记住”用户是谁。为了解决这个问题,Cookie 应运而生。
Cookie 就像是网站给浏览器贴的一张“小纸条”,用于记录用户状态、偏好或身份信息,让网站在用户再次访问时能“认出你”。
本文将带你深入理解 Cookie 的工作原理、Java 实现、安全性问题与替代方案,掌握 Web 会话管理的核心技术。
Cookie(复数:Cookies)是服务器发送到用户浏览器并保存在本地的一小段文本数据,浏览器会在后续请求中自动将其发送回服务器。
username=John)你第一次去咖啡店,店员给你一张会员卡(Cookie),上面写着“常客:拿铁爱好者”。 下次你再来,出示这张卡,店员就知道:“老样子,一杯拿铁!” 这就是 Cookie 的个性化服务。
你在某电商网站登录后,服务器发给你一张“已登录”凭证(Cookie)。 下次访问时,浏览器自动提交这张凭证,你就不用重新输入账号密码了。 这就是 Cookie 的会话管理功能。
用途 | 示例 |
|---|---|
会话管理 | 用户登录状态、购物车内容 |
个性化设置 | 记住语言、主题、字体大小 |
用户行为跟踪 | 统计访问路径、广告点击(需合规) |
A/B 测试 | 根据用户分组展示不同页面 |

属性 | 说明 | Java 设置方法 |
|---|---|---|
Name/Value | 键值对数据 | new Cookie(name, value) |
Max-Age | 有效期(秒) | cookie.setMaxAge(86400)(1天) |
Path | 有效路径范围 | cookie.setPath("/app") |
Domain | 有效域名范围 | cookie.setDomain(".example.com") |
Secure | 仅 HTTPS 传输 | cookie.setSecure(true) |
HttpOnly | 禁止 JS 访问 | cookie.setHttpOnly(true) |
SameSite | 防止 CSRF 攻击 | cookie.setSameSite("Strict") |
💡 最佳实践建议:
HttpOnly + Secure + SameSite=StrictMax-Age 为 1-7 天Domain=.yourdomain.comimport javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
// 1. 获取已有 Cookie
String lastVisit = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("lastVisitTime".equals(cookie.getName())) {
lastVisit = cookie.getValue();
break;
}
}
}
// 2. 输出欢迎信息
if (lastVisit != null) {
response.getWriter().println("<h3>欢迎回来!上次访问时间:" + lastVisit + "</h3>");
} else {
response.getWriter().println("<h3>🎉 欢迎首次访问!</h3>");
}
// 3. 创建新 Cookie 记录当前时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = sdf.format(new Date());
Cookie visitCookie = new Cookie("lastVisitTime", currentTime);
visitCookie.setMaxAge(60 * 60 * 24); // 有效期 1 天
visitCookie.setPath("/"); // 根路径有效
visitCookie.setHttpOnly(true); // 防 XSS
visitCookie.setSecure(true); // 仅 HTTPS
visitCookie.setSameSite("Lax"); // 防 CSRF
// 4. 发送 Cookie 到浏览器
response.addCookie(visitCookie);
}
}public String getCookieValue(HttpServletRequest request, String name) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())) {
return cookie.getValue();
}
}
}
return null;
}public void deleteCookie(HttpServletResponse response, String name) {
Cookie cookie = new Cookie(name, "");
cookie.setMaxAge(0); // 立即删除
cookie.setPath("/");
response.addCookie(cookie);
}风险 | 说明 | 防护措施 |
|---|---|---|
XSS(跨站脚本) | JS 窃取 Cookie | ✅ 设置 HttpOnly=true |
CSRF(跨站请求伪造) | 恶意网站伪造请求 | ✅ 设置 SameSite=Strict/Lax |
中间人攻击 | 明文传输被截获 | ✅ 使用 Secure=true + HTTPS |
敏感信息泄露 | 存储密码等 | ❌ 禁止在 Cookie 中存敏感数据 |
🔐 黄金组合:
HttpOnly + Secure + SameSite=Lax/Strict是现代 Web 应用中 Cookie 的安全标配。
限制 | 说明 |
|---|---|
大小限制 | 每个 Cookie ≤ 4KB |
数量限制 | 每个域名约 20-50 个(浏览器差异) |
总大小限制 | 所有 Cookie 总和约 4KB~8KB |
隐私政策 | GDPR、CCPA 要求用户同意 |
浏览器禁用 | 部分用户会关闭 Cookie |
方案 | 存储位置 | 安全性 | 容量 | 适用场景 |
|---|---|---|---|---|
Cookie | 客户端 | 中等 | ≤4KB | 会话管理、小数据 |
Session | 服务端 | 高 | 无限制 | 登录状态、敏感数据 |
URL 重写 | URL 参数 | 低 | 小 | Cookie 被禁用时备用 |
localStorage | 客户端 | 中 | ~5MB | 大数据、离线存储 |
sessionStorage | 客户端 | 中 | ~5MB | 临时数据、会话级 |
✅ 推荐组合:
JWT + HttpOnly CookielocalStorageCookie 或 localStorageHttpOnly 和 SecureSameSite 属性Cookie 是 Web 开发的基石技术之一,虽然简单,但背后涉及安全、隐私、用户体验等多重考量。
理解 Cookie 的原理与限制,合理使用并做好安全防护,是每一位 JavaWeb 开发者的必修课。
🌐 在前后端分离、微服务、SPA 架构盛行的今天,Cookie 依然在身份认证、会话保持、跨域共享等场景中发挥着不可替代的作用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。