作为一名 Java 工程师,理解 Cookie 和 Session 的概念和使用方法是非常重要的。以下是对这两个概念的详细讲解:
Cookie 是存储在客户端(通常是浏览器)上的小数据片段。它们由服务器发送,并在后续请求中被客户端发送回服务器。Cookie 通常用于存储用户偏好、会话标识符以及其他需要跨多个请求持久化的信息
maxAge),过期后浏览器会自动删除在 Java Web 应用中,可以使用 javax.servlet.http.Cookie 类来创建和管理 Cookie(Boot 3.x 起 Servlet API 迁移至 jakarta.servlet.http.Cookie,方法名不变)
创建和发送 Cookie:
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
public void addCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("username", "john_doe");
cookie.setMaxAge(24 * 60 * 60); // 设置 Cookie 有效期为一天
response.addCookie(cookie);
}读取 Cookie:
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
public String getCookieValue(HttpServletRequest request, String name) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(name)) {
return cookie.getValue();
}
}
}
return null;
}Session 是一种在服务器端保持用户状态的方法。Session 通常与特定用户相关联,使用唯一的会话 ID(通常存储在 Cookie 中)来识别用户。Session 数据存储在服务器上,可以包含用户的登录状态、购物车信息等
在 Java Web 应用中,可以使用 javax.servlet.http.HttpSession 类来创建和管理 Session(Boot 3.x 起为 jakarta.servlet.http.HttpSession)
创建和存储数据到 Session:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public void createSession(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("username", "john_doe");
session.setMaxInactiveInterval(30 * 60); // 设置 Session 过期时间为30分钟
}读取 Session 数据:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public String getSessionValue(HttpServletRequest request, String name) {
HttpSession session = request.getSession(false);
if (session != null) {
return (String) session.getAttribute(name);
}
return null;
}销毁 Session:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public void invalidateSession(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
}存储位置:
安全性:
数据大小:
生命周期:
适用场景:
| 特性 | 传统方案 | 当前实践 |
|---|---|---|
| 会话存储 | 服务端内存 Session | 分布式会话:Redis 存储(Spring Session Redis) |
| 会话标识 | JSESSIONID Cookie | 不变;可配置 HttpOnly/Secure/SameSite 增强安全 |
| 单点登录 | 自研 | OAuth2/OIDC、JWT(无状态)或 Spring Session + SSO |
| 跨域会话 | 需共享域 | SameSite=None + Secure + 三方 Cookie 受限,倾向 token 方案 |
| 集群扩展 | sticky session | 无状态 JWT 或 Redis 会话,天然水平扩展 |
Cookie/Session 基础机制不随版本变化;现代工程重点是会话外置(Redis)、安全属性(SameSite)与向无状态 JWT 演进的取舍。