1. 概述
本文将深入讲解 在 Java Servlet 中处理 Cookie 和 Session 的核心技术。我们将简要介绍 Cookie 的基本概念,并通过实际用例展示其应用场景。
2. Cookie 基础
简单来说,Cookie 是存储在客户端的小块数据,服务器在与客户端通信时使用它。它们主要用于在后续请求中识别客户端,也可用于在 Servlet 之间传递数据。
⚠️ 注意:Cookie 的安全性需谨慎处理,敏感数据切勿直接存储
2.1 创建 Cookie
Cookie
类位于 jakarta.servlet.http
包中。要发送给客户端,需先创建实例并添加到响应中:
Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);
2.2 设置 Cookie 过期时间
通过 maxAge(int)
方法设置有效期(单位:秒):
uiColorCookie.setMaxAge(60*60); // 1小时有效期
过期后,浏览器将自动删除该 Cookie,后续请求不再携带。
2.3 设置 Cookie 域名
使用 setDomain(String)
指定可接收该 Cookie 的域名:
uiColorCookie.setDomain("example.com");
✅ 该 Cookie 将发送给 example.com
及其所有子域名
❌ 未显式设置时,默认为创建 Cookie 的域名(如 www.example.com
)
2.4 设置 Cookie 路径
通过 setPath(String)
指定生效路径:
uiColorCookie.setPath("/welcomeUser");
✅ 该 Cookie 将发送给 /welcomeUser
及其所有子路径
❌ 未设置时,默认为创建 Cookie 的当前路径及其子路径
2.5 在 Servlet 中读取 Cookie
客户端将 Cookie 添加到请求中,可通过 HttpServletRequest
的 getCookies()
获取:
public Optional<String> readCookie(String key) {
return Arrays.stream(request.getCookies())
.filter(c -> key.equals(c.getName()))
.map(Cookie::getValue)
.findAny();
}
2.6 删除 Cookie
删除 Cookie 的技巧:添加同名 Cookie 并设置 maxAge=0
:
Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);
典型场景:用户登出时清除会话数据。
3. HttpSession 对象
HttpSession
是另一种跨请求存储用户数据的方案。Session 是服务器端存储,数据隔离在不同会话间(客户端只能访问自己的会话)。与 Cookie 不同,Session 可存储任意对象。
3.1 获取 Session
直接从请求获取 Session:
HttpSession session = request.getSession(); // 不存在则创建
等价写法:
request.getSession(true) // 不存在则创建
request.getSession(false) // 仅获取已存在的 Session
⚠️ JSP 默认自动创建 Session,可通过
<%@ page session="false" %>
禁用
服务器通常通过名为 JSESSIONID
的 Cookie 管理会话标识。
3.2 Session 属性操作
Session 提供以下核心方法:
setAttribute(String, Object)
:创建/替换属性getAttribute(String)
:读取属性值removeAttribute(String)
:删除属性
属性操作示例:
// 创建属性
HttpSession session = request.getSession();
session.setAttribute("attributeKey", "Sample Value");
// 读取属性
String value = (String) session.getAttribute("attributeKey");
// 删除属性
session.removeAttribute("attributeKey");
销毁整个会话(用户登出场景):
session.invalidate(); // 清除所有会话数据
4. 总结
本文深入探讨了两种维持 HTTP 状态的核心机制:
- Cookie:客户端存储,适合轻量级数据
- Session:服务器端存储,支持复杂数据结构
💡 记住:HTTP 是无状态协议,合理使用这些机制是 Web 开发的基础
完整代码示例可在 GitHub 获取。