Servlet Cookie 处理(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在 Web 开发中,Servlet Cookie 处理是一项核心技能,它帮助开发者实现用户身份识别、会话跟踪以及个性化设置等功能。Servlet 作为 Java Web 开发的基础技术,与 Cookie 的结合能有效提升用户体验。本文将从零开始讲解 Cookie 的基本原理、Servlet 中的处理流程,以及常见问题的解决方案,并通过案例演示如何将理论应用于实际开发中。


Cookie 的基础概念

Cookie 是存储在用户浏览器中的小型数据片段,通常用于记录用户与网站的交互信息。可以将其想象为一家餐厅的“会员卡”:当顾客首次到店时,服务员(Servlet)会发放一张卡片(Cookie),后续访问时,服务员通过这张卡片识别顾客身份并提供个性化服务。

Cookie 的核心属性

  1. Name(名称):唯一标识符,如 user_idtheme_preference
  2. Value(值):存储的具体信息,需经过 URL 编码。
  3. Domain(域名):Cookie 适用的域名范围,例如 .example.com
  4. Path(路径):指定 Cookie 适用的 URL 路径,如 /user
  5. Max-Age(有效期):单位为秒,过期后 Cookie 将自动删除。
  6. Secure(安全标志):仅通过 HTTPS 传输。
  7. HttpOnly(安全标志):防止 JavaScript 访问,减少 XSS 攻击风险。

在 Servlet 中创建和发送 Cookie

步骤一:创建 Cookie 对象

Cookie userCookie = new Cookie("username", "john_doe");  
// 设置 Cookie 的有效期为 1 天(24*60*60 秒)  
userCookie.setMaxAge(86400);  

比喻:这相当于服务员在会员卡上写下顾客姓名和有效期,并盖上餐厅的公章。

步骤二:将 Cookie 添加到响应头

// 将 Cookie 添加到 HttpServletResponse 对象中  
response.addCookie(userCookie);  

关键点:Cookie 必须通过 HTTP 响应头发送,浏览器才会存储它。


从请求中读取 Cookie

当浏览器再次发送请求时,会自动携带之前存储的 Cookie。Servlet 可通过以下方式获取:

Cookie[] cookies = request.getCookies();  
if (cookies != null) {  
    for (Cookie cookie : cookies) {  
        if ("username".equals(cookie.getName())) {  
            String username = cookie.getValue();  
            // 进行业务处理,如加载用户配置  
        }  
    }  
}  

注意request.getCookies() 返回的是 Cookie 数组,需遍历匹配目标 Cookie。


修改和删除 Cookie

修改 Cookie 的值

Cookie userCookie = new Cookie("username", "jane_smith");  
userCookie.setMaxAge(86400);  
response.addCookie(userCookie);  

原理:浏览器会以“后发制人”的方式覆盖同名 Cookie,新 Cookie 的值将覆盖旧值。

删除 Cookie

Cookie expiredCookie = new Cookie("username", "");  
expiredCookie.setMaxAge(0); // 设置过期时间为立即生效  
response.addCookie(expiredCookie);  

比喻:这相当于用户主动将会员卡退回餐厅,服务员标记其为无效。


Servlet Cookie 处理的常见问题与解决方案

问题 1:跨域 Cookie 无法读取

原因:Cookie 的 Domain 和 Path 设置不匹配目标请求路径。
解决方案

// 设置 Cookie 的域名和路径为全站可用  
Cookie sessionCookie = new Cookie("session_id", "abc123");  
sessionCookie.setDomain(".example.com"); // 注意前导点  
sessionCookie.setPath("/");  
response.addCookie(sessionCookie);  

问题 2:Cookie 有效期未生效

原因:未设置 setMaxAge() 或值为负数(默认行为是关闭浏览器时失效)。
解决方案

// 设置 Cookie 持续 7 天  
cookie.setMaxAge(60 * 60 * 24 * 7);  

问题 3:中文字符乱码

原因:Cookie 的值未进行 URL 编码。
解决方案

String encodedValue = URLEncoder.encode("中文值", "UTF-8");  
Cookie langCookie = new Cookie("language", encodedValue);  
// 读取时解码  
String decoded = URLDecoder.decode(cookie.getValue(), "UTF-8");  

安全性注意事项

  1. 敏感信息存储:避免在 Cookie 中保存密码、API 密钥等敏感数据。
  2. HttpOnly 标志:防止 JavaScript 漏洞窃取 Cookie。
  3. HTTPS 加密:通过 HTTPS 传输 Cookie,防止中间人攻击。
  4. CSRF 防护:结合令牌(Token)机制,避免跨站请求伪造。

实战案例:实现“记住我”功能

需求分析

用户登录时选择“记住我”,下次访问无需重新登录。

实现步骤

  1. 登录成功后生成 Session ID
// 登录成功后创建唯一 Session ID  
String sessionId = UUID.randomUUID().toString();  
Cookie sessionCookie = new Cookie("session_id", sessionId);  
sessionCookie.setMaxAge(60 * 60 * 24 * 7); // 7 天有效期  
response.addCookie(sessionCookie);  

// 将 Session ID 与用户信息绑定(可存储在数据库或内存中)  
sessionStore.put(sessionId, user);  
  1. 后续请求验证身份
Cookie[] cookies = request.getCookies();  
if (cookies != null) {  
    for (Cookie cookie : cookies) {  
        if ("session_id".equals(cookie.getName())) {  
            String sessionId = cookie.getValue();  
            User user = sessionStore.get(sessionId);  
            if (user != null) {  
                // 用户已登录,跳转到主页  
                response.sendRedirect("/home");  
                return;  
            }  
        }  
    }  
}  
// 未找到有效 Session,跳转到登录页  
response.sendRedirect("/login");  

总结

本文系统讲解了 Servlet Cookie 处理 的核心知识点,从 Cookie 的基础概念、创建、读取、修改到安全性实践,均提供了代码示例和直观比喻。通过“记住我”功能的实战案例,读者可以快速掌握如何在实际项目中应用这些技术。

关键要点回顾

  • Cookie 是浏览器端的轻量级存储,需通过 HTTP 头与服务器交互。
  • Servlet 中的 Cookie 操作需注意有效期、域名、路径等配置细节。
  • 安全性始终是 Cookie 处理的重中之重,需结合 HTTPS 和 HttpOnly 标志。

希望本文能帮助开发者高效完成 Web 应用的会话管理和用户个性化需求,进一步提升开发技能。

最新发布