第70篇Cookie与Session2026版系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第69篇JSP与EL表达式 |➡️ 下一篇第71篇HTTP协议详解️ 本文阅读地图3 分钟速览第69篇搞定了JSP与EL本篇深入Cookie与Session会话管理。HTTP是无状态的——每次请求都是独立的服务器记不住你是谁。Cookie和Session就是给HTTP加状态的两大核心技术模块核心问题一句话回答HTTP无状态为什么需要会话管理HTTP协议设计为无状态服务器不记住任何用户信息Cookie本质Cookie到底是什么服务器发给浏览器的小纸条浏览器自动保存、自动携带Session本质Session到底是什么服务器端的VIP客户档案存着用户的身份和状态数据两者关系Cookie和Session怎么配合Session ID是桥梁——Cookie存Session IDSession存用户数据JWT/TokenSession会被淘汰吗不会。JWT有无法即时作废的致命弱点大厂核心业务仍用Session分布式Session多台服务器怎么办Spring Session Redis 统一存储业界标准方案面试最爱问高频考点有哪些见文末 小节一、核心知识点1. HTTP为什么是无状态的HTTP协议设计初衷就是无状态——服务器不记住任何用户信息每个请求相互独立。好处是简单、高性能、易扩展。但带来一个致命问题服务器记不住你是谁。你刚登录成功点一下下一页服务器又不认识你了。核心问题Cookie、Session、Token 都是为了给 HTTP加状态、做身份识别才诞生的。2. 会话Session是什么会话是一个客户端与服务器之间的不中断的请求响应序列。当客户端发送第一个请求时开始一个会话当客户端结束会话或在时限内没有再发送请求会话结束。3. Cookie vs Session 核心定位对比CookieSession存储位置浏览器客户端服务器端存储内容键值对文本最大4KB任意Java对象安全性较低明文存储易被篡改较高数据在服务端生命周期由Max-Age控制可持久化服务器控制默认30分钟超时典型用途存储偏好设置、Session ID用户登录状态、购物车核心理解Cookie是容器/载体Session是服务端状态。Cookie本身不解决认证问题它最常见的用途是承载Session ID。两者配合实现保持用户登录、记录操作信息。二、通俗讲解1分钟开心学把Cookie和Session想象成会员卡 保险柜Cookie你随身携带的会员卡。上面只写着一个卡号Session ID不写你的隐私信息。Session咖啡馆后台的保险柜。你的消费记录、积分、隐私信息都锁在保险柜里服务员凭你会员卡上的卡号找到对应的保险柜。更通俗地说Cookie 客户端身份证你随身带的小卡片Session 服务器的身份档案后台存着你的完整信息两者配合你每次来只要亮出身份证Cookie服务员就能从档案柜Session里调出你的全部信息。三、Cookie 详解3.1 Cookie是什么Cookie是服务器发送给浏览器并保存在客户端的一小段文本数据。浏览器自动保存并在后续每次请求时自动携带。本质Cookie 的底层实现依赖两个 HTTP 头——响应头Set-Cookie服务器下发和请求头Cookie浏览器自动携带。3.2 Cookie工作流程3.3 Cookie核心属性属性作用示例Max-Age过期时间秒Max-Age36001小时后过期Domain作用域名Domain.example.com含子域名Path作用路径Path/admin仅/admin路径生效Secure仅HTTPS传输Securehttp请求不携带HttpOnly禁止JS访问HttpOnly防XSS攻击SameSite跨站请求限制SameSiteStrict防CSRF生命周期详解正数持久Cookie写入硬盘存活指定秒数后自动删除负数/不设置会话Cookie存在浏览器内存关闭浏览器即消失零立即删除该Cookie3.4 Java Web 中的 Cookie 操作发送 Cookie 到客户端CookiecookienewCookie(key,value);cookie.setMaxAge(60*60*24*7);// 7天有效期cookie.setHttpOnly(true);// 防止XSS攻击response.addCookie(cookie);获取客户端携带的 CookieCookie[]cookiesrequest.getCookies();if(cookies!null){for(Cookiecookie:cookies){Stringnamecookie.getName();Stringvaluecookie.getValue();}}⚠️特别注意Cookie不能直接存储中文必须进行URL编码/解码。// 存储中文时编码StringencodedURLEncoder.encode(张三,UTF-8);CookiecookienewCookie(username,encoded);response.addCookie(cookie);// 取出中文时解码StringdecodedURLDecoder.decode(cookie.getValue(),UTF-8);四、Session 详解4.1 Session是什么Session是服务器端存储用户会话状态的内存/存储对象。当用户首次访问网站时服务器会为用户创建一个唯一的Session ID并通过Cookie将其发送到客户端。为什么需要SessionCookie是明文存储在客户端的用户可以随意修改比如把usernameguest改成usernameadmin。Session就是为了解决信任问题而生的。4.2 Session核心流程4.3 Session 生命周期阶段说明创建第一次调用request.getSession()时创建使用通过session.setAttribute()/getAttribute()存取数据超时默认30分钟无活动后自动销毁可在web.xml配置手动销毁调用session.invalidate()立即销毁延迟创建Session是懒加载的——第一次调用request.getSession()时才创建不是一访问就创建。4.4 Java Web 中的 Session 操作// 获取Session不存在则创建HttpSessionsessionrequest.getSession();// 获取Session IDStringsessionIdsession.getId();// 存储数据session.setAttribute(userId,1001);session.setAttribute(userName,张三);// 读取数据IntegeruserId(Integer)session.getAttribute(userId);// 设置超时时间秒session.setMaxInactiveInterval(60*30);// 30分钟// 手动销毁登出session.invalidate();4.5 禁用Cookie后Session还能用吗能。可以通过URL重写来传输Session ID——将jsessionidABC123拼接到URL中。Servlet API提供了response.encodeURL()方法自动处理Stringurlresponse.encodeURL(/user/profile);// 如果Cookie可用返回原URL如果禁用自动追加 ;jsessionidxxx⚠️注意URL重写风险高、体验差仅可作为极端情况下的降级方案。实际生产环境极少使用。五、Cookie vs Session完整对比维度CookieSession存储位置浏览器客户端服务器端内存/Redis/数据库存储内容键值对文本任意Java对象大小限制单个约4KB受服务器内存限制安全性较低明文、可篡改较高数据不暴露给客户端生命周期Max-Age控制服务器控制默认30分钟网络传输每次请求都携带只传Session ID数据不传输典型场景偏好设置、自动登录登录状态、购物车六、JWTToken与 Session 的抉择6.1 JWT是什么JWTJSON Web Token是一种无状态的、自包含的Token格式标准。服务器不存储会话状态只负责生成和验证Token。6.2 Session vs JWT 核心差异对比Session方案JWT方案比喻“会员卡 账本”“现金”服务端状态有状态Stateful——存Session记录无状态Stateless——不存任何记录控制权服务端客户端只要没过期就能用即时作废✅ 删除Redis记录即可❌ 无法作废只能等过期6.3 JWT的致命弱点无法即时作废面试官问“现在都2026年了登录鉴权是不是该全切到JWT了”如果你回答当然面试官会补一刀那如果用户手机丢了或者改了密码你怎么把旧的JWT立即作废这一问往往能把90%的候选人问懵。在Session方案里太简单了客服后台点一下下线服务端把Redis里的sessionId删了秒级生效。在JWT方案里Token发出去了就像泼出去的水只要还在有效期内哪怕你把用户密码改了拿着旧Token的黑客依然畅通无阻。常见补救方案都很尴尬设短过期时间如5分钟用户每5分钟重新登录体验爆炸搞黑名单Blacklist每次请求查Redis黑名单——既然都要查Redis了为什么不直接用Session6.4 为什么大厂特别是金融/支付偏爱Session因为控制权必须在服务端——用户手机丢了、密码泄露了必须能立即让所有旧会话失效。JWT做不到这一点。一句话总结Session适合我需要随时把你踢下线的场景JWT适合过期时间短、不需要主动作废的场景。七、分布式Session2026年重点7.1 问题一台机器没事两台机器就闹脾气这就是分布式会话管理要解决的核心问题Session在哪里、怎么共享、如何隔离。7.2 三种解决方案对比方案说明缺点Session复制每台服务器同步所有Session网络开销大扩展性差Session粘滞Sticky负载均衡始终将同一用户路由到同一服务器单点故障实例挂了Session就丢了集中式存储✅主流所有服务器共享Redis存储Session引入外部依赖7.3 业界标准方案Spring Session Redis在2026年的技术栈中Spring Session Redis已成为Java Web应用的标准配置优势说明解耦性强应用服务器不再依赖特定容器持久化存储即使应用程序重启用户Session依然有效多服务器共享多台服务器共享同一用户的Session信息无缝集成与Spring Boot完美集成简单配置即可启用快速配置Spring Boot 3.x!-- pom.xml 依赖 --dependencygroupIdorg.springframework.session/groupIdartifactIdspring-session-data-redis/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency# application.ymlspring:session:store-type:redisredis:host:localhostport:6379八、避坑要点错误/误区后果正确做法在Cookie中直接存敏感信息用户名、密码明文暴露易被窃取只存Session ID或加密后的Token忘记设置Cookie的HttpOnly属性易受XSS攻击窃取Cookiecookie.setHttpOnly(true)分布式部署仍用内存Session用户频繁被登出改用Spring Session RedisSession超时时间设置过长或过短过长→安全风险过短→用户体验差根据业务场景设置合理值默认30分钟忘记调用session.invalidate()Session无法及时释放内存泄漏登出时主动调用invalidate()混淆getSession()和getSession(false)前者创建新Session后者不创建根据需求选择需要创建用前者仅获取用后者盲目跟风全切JWT无法即时作废Token安全漏洞根据场景选择需要踢人下线用Session九、面试高频考点Q1Cookie和Session的区别是什么Cookie存储在客户端浏览器Session存储在服务器端。Cookie只能存文本最大4KBSession可以存任意Java对象。Cookie安全性较低Session安全性较高。两者通过Session ID关联——Cookie存Session IDSession存用户数据。Q2Session的工作原理是什么用户首次访问时服务器调用request.getSession()创建一个HttpSession对象生成唯一的Session ID。服务器通过Set-Cookie头将Session IDJSESSIONID发送给浏览器。浏览器后续请求自动携带该Cookie。服务器根据Session ID查找对应的Session数据。Q3禁用Cookie后Session还能用吗怎么实现能。可以通过URL重写来传输Session ID——将jsessionidxxx拼接到URL中。Servlet API提供了response.encodeURL()方法自动处理。但URL重写风险高、体验差仅作为降级方案。Q4分布式环境下如何解决Session共享问题主流方案是Spring Session Redis 集中式存储。将所有服务器的Session数据统一存储到Redis中所有应用节点读写同一份数据。这样即使服务器重启或负载均衡切换到其他节点用户的Session依然有效。Q5既然JWT这么火为什么大厂还在用Session因为JWT无法即时作废。用户手机丢了、改了密码服务端无法让旧的JWT立即失效。Session方案只需删除Redis中的Session记录即可秒级生效。大厂特别是金融/支付需要随时能把用户踢下线的控制能力所以核心业务仍用Session。 面试官追问陷阱加分题追问1“用户登录后我把浏览器关了Session就销毁了吗”不一定。Session是否销毁取决于服务端而不是浏览器。浏览器关闭只会销毁会话级Cookie没有设置Max-Age的Cookie但服务端的Session仍在直到超时默认30分钟或被手动invalidate()。如果用户重新打开浏览器由于Cookie已丢失服务器无法找到原来的Session会创建一个新Session——但旧的Session还在服务端占用内存直到超时释放。追问2“request.getSession()和request.getSession(false)有什么区别”request.getSession()获取当前Session如果不存在则创建一个新的。request.getSession(false)获取当前Session如果不存在则返回null不创建。后者常用于判断是否已登录的场景——如果Session不存在说明用户未登录直接跳转登录页。十、练习题简答题为什么说Cookie是容器Session是服务端状态代码题编写一个登录Servlet登录成功后创建Session并存储用户信息同时创建一个7天自动登录的Cookie。分析题某电商系统部署了3台服务器用户反馈登录后刷新页面偶尔会退出登录。请分析可能的原因并给出解决方案。 你的学习进度当前第70篇 / 共108篇 ·进阶篇JavaWeb核心技术第68~72篇✅ 已完成基础篇44篇 第45~70篇 正在学第70篇⏳ 待学习第71~108篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 下一篇文章预告下一篇《第71篇HTTP协议详解》内容简介HTTP请求/响应结构、常见状态码200/301/302/400/401/403/404/500、HTTPS握手简化版、HTTP/2与HTTP/3新特性。JavaWeb专题持续深入拿下HTTP协议《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送