Java Servlet Cookie 详解:读写、权限控制与实战应用

纸上星河
纸上星河
发布时间:2026-10-13| 5人浏览过
原创

Cookie是Java Servlet中用于在客户端存储轻量级数据的关键技术,常用于保持用户登录状态和记录浏览偏好。本文通过六个核心步骤,从基础CRUD操作深入到基于Path的权限隔离,再到登录时间与浏览历史的实战案例,并提供针对主流浏览器的容量测试结论,帮助开发者构建稳定、安全的会话管理机制。

结果或目标

完成对 Java Servlet 环境中 Cookie 技术的全面掌握,包括:

  • 理解 Cookie 的基本结构(Key-Value)及 HTTP 传输机制。
  • 能够通过 setMaxAge 和 setPath 精确管理 Cookie 的生存周期与作用范围。
  • 利用 Cookie 实现实用的业务场景:记录用户登录时间与追踪最近访问资源。
  • 掌握在删除 Cookie 时的关键路径匹配规则及常见误区。

准备条件

  1. 开发环境:JDK 1.8+,支持 Servlet 3.0+ 规范的容器(如 Apache Tomcat)。
  2. 项目配置:web.xml 已正确声明 Servlet 映射;前端页面(JSP/HTML)包含发起请求的链接。

真实操作顺序

第1步:创建与读写 Cookie

目的:展示如何向客户端写入基础 Cookie,并处理编码问题。

入口:新建 Servlet CookieDemo,继承自 HttpServlet。

动作:

  1. 实例化 Cookie:Cookie c = new Cookie("name", "jack_" + randomNum);。
  2. 设置有效期:c.setMaxAge(3600)(以秒为单位)。
  3. 设置作用域:c.setPath(contextPath),确保同项目下其他 Servlet 可读取。
  4. 发送响应:response.addCookie(c)。
  5. 编码注意:涉及中文时,务必使用 URLEncoder.encode(value, "UTF-8") 进行编码,并在读取时使用 URLDecoder.decode() 解码。

初次访问时,服务器生成随机数值并作为值写入 Cookie,此时客户端无历史记录。

再次访问时,request.getCookies() 方法能成功获取到上一次设置的 Cookie 值,验证了客户端存储的有效性。

第2步:Cookie 的访问权限控制(Path)

目的:演示如何通过 path 属性隔离不同模块的数据访问。

入口:CookieDemo2,映射路径为 /servlet/CookieDemo2。

动作:

  1. 将新 Cookie 的 Path 设置为精细路径:c.setPath(request.getContextPath() + "/servlet/CookieDemo2")。
  2. 访问此 Servlet 会看到之前设置的粗粒度(项目根目录)Cookie,反之则不可见。

原理:Cookie 机制中,只有当前请求的路径等于或包含在 Cookie 的 Path 中时,才会自动附加该 Cookie。不同 Path 即使 Key 相同,也是完全独立的对象。

先进入 CookieDemo2 页面,可以成功读取到之前设置在项目根目录的 name-cookie。

再进入 CookieDemo 页面,由于 CookieDemo 的上下文未定义特定子路径权限,无法读取仅在特定路径生效的 age-cookie。

第3步:安全删除 Cookie

目的:展示如何注销用户或清除敏感信息,重点在于“同名同路径”原则。

入口:DelCookieDemo。

动作:

  1. 找到目标 Cookie(如 key 为 name)。
  2. 关键参数:必须调用 c.setPath(old_path) 且该路径必须与创建时完全一致。
  3. 设置过期:调用 c.setMaxAge(0)。
  4. 发送响应:执行 response.addCookie(c) 通知浏览器删除。

风险提醒:如果设置 Path 不一致,服务器实际上是在发送一个新的、已过期的 Cookie,这并不能删除原始存在的 Cookie。

初始状态下,name Cookie 依然存在。

访问删除接口后,服务端逻辑触发删除流程。

再次检查浏览器 Cookie,发现 name 已被移除。

刷新界面确认,name 字段不再存在。

第4步:实战——记录用户上次登录时间

目的:利用长生命周期 Cookie 提升用户体验。

入口:LoginServlet。

动作:

  1. 读取 Cookies,查找名为 loginTime 的值。
  2. 若存在:解析 Long 类型的时间戳,格式化为日期字符串显示给前一次登录时间。
  3. 若不存在:提示首次访问。
  4. 更新:无论是否第一次访问,都重新生成当前时间戳并写入 Cookie。
  5. 配置:setMaxAge(60*60*24*30*12)(约一年),setPath 设为项目根路径。

首次访问时,系统提示这是最近一年的初次访问。

再次访问时,准确显示了上一次的登录时间。

第5步:实战——记录最近浏览的图片历史

目的:利用数组逻辑模拟队列,追踪最近的 N 个资源。

入口:ShowServlet,接收参数 img。

动作:

  1. 读取是否存在 images Cookie,其值为逗号分隔的图片文件名字符串(如 a.jpg,b.jpg)。
  2. 去重逻辑:如果当前图片已在列表中,将其移动到列表最前;否则追加到末尾。
  3. 长度限制:当分隔符个数超过阈值(例如 3)时,截断掉最早的历史记录。
  4. 更新 Cookie 值:c.setValue(imgs),设置较长时间有效期(一个月)。

JSP 前端通过解析这个字符串,动态渲染缩略图区域。

第6步:浏览器 Cookie 限制测试

目的:了解不同浏览器对 Cookie 数量和容量的物理上限。

动作:

  1. 循环创建大量 Cookie(测试数量)或超长字符串(测试单值大小)。
  2. 观察输出日志或浏览器控制台报错情况。

测试结果显示(以 Firefox 为例):

  • 数量上限:单个域名下通常限制在 50-100 个左右(受浏览器版本影响,Firefox 部分版本支持约 110 个)。
  • 容量上限:单个 Cookie 最大约为 4092 字节(4KB)。

简要总结

Cookie 是 Web 端维持状态的有力工具,但在使用时必须严格遵守 Path 隔离原则以防止数据串扰,且处理中文必须经过 URL 编解码。对于需要长期保存的用户偏好(如登录记录、浏览历史),建议合理设置过期时间;而对于大体积数据或敏感信息,应优先考虑使用 HttpSession 或服务端数据库。

以上就是Java Servlet Cookie技术的详细内容,更多关于Java Web开发基础与高级特性的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。