Java Servlet Cookie 详解:读写、权限控制与实战应用
Cookie是Java Servlet中用于在客户端存储轻量级数据的关键技术,常用于保持用户登录状态和记录浏览偏好。本文通过六个核心步骤,从基础CRUD操作深入到基于Path的权限隔离,再到登录时间与浏览历史的实战案例,并提供针对主流浏览器的容量测试结论,帮助开发者构建稳定、安全的会话管理机制。
结果或目标
完成对 Java Servlet 环境中 Cookie 技术的全面掌握,包括:
- 理解 Cookie 的基本结构(Key-Value)及 HTTP 传输机制。
- 能够通过
setMaxAge和setPath精确管理 Cookie 的生存周期与作用范围。 - 利用 Cookie 实现实用的业务场景:记录用户登录时间与追踪最近访问资源。
- 掌握在删除 Cookie 时的关键路径匹配规则及常见误区。
准备条件
- 开发环境:JDK 1.8+,支持 Servlet 3.0+ 规范的容器(如 Apache Tomcat)。
- 项目配置:
web.xml已正确声明 Servlet 映射;前端页面(JSP/HTML)包含发起请求的链接。
真实操作顺序
第1步:创建与读写 Cookie
目的:展示如何向客户端写入基础 Cookie,并处理编码问题。
入口:新建 Servlet CookieDemo,继承自 HttpServlet。
动作:
- 实例化 Cookie:
Cookie c = new Cookie("name", "jack_" + randomNum);。 - 设置有效期:
c.setMaxAge(3600)(以秒为单位)。 - 设置作用域:
c.setPath(contextPath),确保同项目下其他 Servlet 可读取。 - 发送响应:
response.addCookie(c)。 - 编码注意:涉及中文时,务必使用
URLEncoder.encode(value, "UTF-8")进行编码,并在读取时使用URLDecoder.decode()解码。
初次访问时,服务器生成随机数值并作为值写入 Cookie,此时客户端无历史记录。
再次访问时,request.getCookies() 方法能成功获取到上一次设置的 Cookie 值,验证了客户端存储的有效性。
第2步:Cookie 的访问权限控制(Path)
目的:演示如何通过 path 属性隔离不同模块的数据访问。
入口:CookieDemo2,映射路径为 /servlet/CookieDemo2。
动作:
- 将新 Cookie 的 Path 设置为精细路径:
c.setPath(request.getContextPath() + "/servlet/CookieDemo2")。 - 访问此 Servlet 会看到之前设置的粗粒度(项目根目录)Cookie,反之则不可见。
原理:Cookie 机制中,只有当前请求的路径等于或包含在 Cookie 的 Path 中时,才会自动附加该 Cookie。不同 Path 即使 Key 相同,也是完全独立的对象。
先进入 CookieDemo2 页面,可以成功读取到之前设置在项目根目录的 name-cookie。
再进入 CookieDemo 页面,由于 CookieDemo 的上下文未定义特定子路径权限,无法读取仅在特定路径生效的 age-cookie。
第3步:安全删除 Cookie
目的:展示如何注销用户或清除敏感信息,重点在于“同名同路径”原则。
入口:DelCookieDemo。
动作:
- 找到目标 Cookie(如 key 为
name)。 - 关键参数:必须调用
c.setPath(old_path)且该路径必须与创建时完全一致。 - 设置过期:调用
c.setMaxAge(0)。 - 发送响应:执行
response.addCookie(c)通知浏览器删除。
风险提醒:如果设置 Path 不一致,服务器实际上是在发送一个新的、已过期的 Cookie,这并不能删除原始存在的 Cookie。
初始状态下,name Cookie 依然存在。
访问删除接口后,服务端逻辑触发删除流程。
再次检查浏览器 Cookie,发现 name 已被移除。
刷新界面确认,name 字段不再存在。
第4步:实战——记录用户上次登录时间
目的:利用长生命周期 Cookie 提升用户体验。
入口:LoginServlet。
动作:
- 读取 Cookies,查找名为
loginTime的值。 - 若存在:解析 Long 类型的时间戳,格式化为日期字符串显示给前一次登录时间。
- 若不存在:提示首次访问。
- 更新:无论是否第一次访问,都重新生成当前时间戳并写入 Cookie。
- 配置:
setMaxAge(60*60*24*30*12)(约一年),setPath设为项目根路径。
首次访问时,系统提示这是最近一年的初次访问。
再次访问时,准确显示了上一次的登录时间。
第5步:实战——记录最近浏览的图片历史
目的:利用数组逻辑模拟队列,追踪最近的 N 个资源。
入口:ShowServlet,接收参数 img。
动作:
- 读取是否存在
imagesCookie,其值为逗号分隔的图片文件名字符串(如a.jpg,b.jpg)。 - 去重逻辑:如果当前图片已在列表中,将其移动到列表最前;否则追加到末尾。
- 长度限制:当分隔符个数超过阈值(例如 3)时,截断掉最早的历史记录。
- 更新 Cookie 值:
c.setValue(imgs),设置较长时间有效期(一个月)。
JSP 前端通过解析这个字符串,动态渲染缩略图区域。
第6步:浏览器 Cookie 限制测试
目的:了解不同浏览器对 Cookie 数量和容量的物理上限。
动作:
- 循环创建大量 Cookie(测试数量)或超长字符串(测试单值大小)。
- 观察输出日志或浏览器控制台报错情况。
测试结果显示(以 Firefox 为例):
- 数量上限:单个域名下通常限制在 50-100 个左右(受浏览器版本影响,Firefox 部分版本支持约 110 个)。
- 容量上限:单个 Cookie 最大约为 4092 字节(4KB)。
简要总结
Cookie 是 Web 端维持状态的有力工具,但在使用时必须严格遵守 Path 隔离原则以防止数据串扰,且处理中文必须经过 URL 编解码。对于需要长期保存的用户偏好(如登录记录、浏览历史),建议合理设置过期时间;而对于大体积数据或敏感信息,应优先考虑使用 HttpSession 或服务端数据库。
以上就是Java Servlet Cookie技术的详细内容,更多关于Java Web开发基础与高级特性的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









