1. 概述

本文将深入讲解 在 Java Servlet 中处理 Cookie 和 Session 的核心技术。我们将简要介绍 Cookie 的基本概念,并通过实际用例展示其应用场景。

简单来说,Cookie 是存储在客户端的小块数据,服务器在与客户端通信时使用它。它们主要用于在后续请求中识别客户端,也可用于在 Servlet 之间传递数据。

⚠️ 注意:Cookie 的安全性需谨慎处理,敏感数据切勿直接存储

Cookie 类位于 jakarta.servlet.http 包中。要发送给客户端,需先创建实例并添加到响应中:

Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);

通过 maxAge(int) 方法设置有效期(单位:秒):

uiColorCookie.setMaxAge(60*60); // 1小时有效期

过期后,浏览器将自动删除该 Cookie,后续请求不再携带。

使用 setDomain(String) 指定可接收该 Cookie 的域名:

uiColorCookie.setDomain("example.com");

✅ 该 Cookie 将发送给 example.com 及其所有子域名
❌ 未显式设置时,默认为创建 Cookie 的域名(如 www.example.com

通过 setPath(String) 指定生效路径:

uiColorCookie.setPath("/welcomeUser");

✅ 该 Cookie 将发送给 /welcomeUser 及其所有子路径
❌ 未设置时,默认为创建 Cookie 的当前路径及其子路径

客户端将 Cookie 添加到请求中,可通过 HttpServletRequestgetCookies() 获取:

public Optional<String> readCookie(String key) {
    return Arrays.stream(request.getCookies())
      .filter(c -> key.equals(c.getName()))
      .map(Cookie::getValue)
      .findAny();
}

删除 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 状态的核心机制:

  1. Cookie:客户端存储,适合轻量级数据
  2. Session:服务器端存储,支持复杂数据结构

💡 记住:HTTP 是无状态协议,合理使用这些机制是 Web 开发的基础

完整代码示例可在 GitHub 获取。


原始标题:Handling Cookies and a Session in a Java Servlet | Baeldung