Cookie和Session

Session 的本质是基于 Cookie 的

Session 是 Web 应用中用于维持用户状态的一种机制。其底层实现通常依赖于 Cookie 技术,通过 JSESSIONID 来标识用户的会话信息。

首次请求时:

当用户首次访问服务器时,Servlet 容器会检查 HTTP 请求中是否包含名为 JSESSIONID 的 Cookie,并查找是否存在与该 ID 对应的 HttpSession 对象。

  • 如果是首次访问,且程序中没有调用 getSession()getSession(true),则不会创建 Session;
  • 只有当代码中显式调用 getSession()getSession(true)时,容器才会:
    • 创建一个新的 HttpSession
    • 生成唯一的 JSESSIONID
    • 将该 ID 写入响应头中的 Set-Cookie: JSESSIONID=xxx,返回给浏览器;
  • 浏览器保存该 Cookie 后,在后续请求中将自动携带 JSESSIONID,用于识别用户会话。

后续请求时:

当用户再次发起请求时,浏览器会自动携带之前保存的 JSESSIONID(通过 Cookie)发送到服务器。

  • Servlet 容器检测到请求中包含 JSESSIONID,并能查找到对应的 HttpSession
  • 此时调用 getSession()getSession(true) 会直接返回已有的 Session(不会重新创建新的 Session),除非当前 Session 已失效或过期。

当 Session 被强制失效或自然过期后:

如果 Session 被手动调用 invalidate() 方法销毁,或者因超时而自然过期:

  • 用户再次发起请求时,虽然请求中仍携带了 JSESSIONID
  • 但服务器已找不到对应的 Session;
  • 此时若调用 getSession()getSession(true),容器将重新创建一个新的 Session;
  • 并生成新的 JSESSIONID 返回给客户端,继续后续会话。

特别说明:关于 getSession(false)

  • getSession(false) 行为不同于其他两个方法;
  • 如果当前请求没有关联有效的 Session(如首次访问或 Session 已过期),它将返回 null
  • 不会强制创建新的 Session
  • 常用于判断当前用户是否已有有效会话,适用于登录状态检测等场景。

Cookie和Session的区别

特性 Cookie Session
存储位置 客户端(如浏览器) 服务器端
安全性 较低,因为数据存储在客户端,可能被用户篡改或窃取。可以通过设置 HttpOnlySecure 标志提高安全性。 较高,因为敏感信息存储在服务器端,不会暴露给客户端。
存储容量 有限制,通常每个域名下最大4KB左右。 可以存储大量数据,受限于服务器的内存或配置的持久化存储空间。
传输 每次请求都会自动携带相关的Cookie到服务器。 只需传递一个短小的 JSESSIONID 到客户端,并通过该ID来关联服务器端的会话数据。
生命周期 可以通过设置 Max-AgeExpires 来控制其生命周期,可以是临时性的也可以是持久化的。 生命周期由服务器控制,通常通过设置超时时间来决定会话的有效期。当会话过期或调用 invalidate() 方法时,会话结束。
适用场景 适合存储少量不敏感的数据,如用户的偏好设置、跟踪访问者等。 适合存储需要保护的信息,如登录状态、购物车内容等。
隐私问题 存储在用户设备上,可能会引起隐私担忧。 数据存储在服务器端,减少了对用户隐私的直接暴露。
跨域限制 受同源策略限制,不同域名下的Cookie不能互相访问。 同一应用服务器上的所有Web应用都可以共享同一个Session,不受同源策略限制。
性能影响 每次请求都会发送Cookie,增加了网络流量和请求大小。 减少了每次请求的数据量,但增加了服务器资源的使用。
管理复杂度 相对简单,主要涉及创建、读取、更新和删除操作。 管理相对复杂,涉及到会话的创建、销毁、持久化以及分布式环境下的同步等问题。
#java##javaweb#
JavaWeb 文章被收录于专栏

此专栏由于更新观看不便,不会保持及时更新,最新更新见计算机合集专栏https://www.nowcoder.com/creation/manager/columnDetail/04yp33

全部评论

相关推荐

后端开发 京东科技 金融支付事业群1.自我介绍问实习时间安排实习经历,追问两段实习经历为什么连在一起2. 项目中遇到问题解决问题的能力(大概是这个意思,记不清了)主要提到一个项目中用的ai大模型,面试官对这个貌似挺感兴趣,一直追问,大概问了接近十分钟,我提了一下了解大模型应用如langchain4j等框架还问了怎么对ai设置prompt可以更好的完成任务,回答:尽量精确到具体功能,使用前git版本管理,使用后即时验证功能,若不对则回滚3. Redis相关(1)缓存穿透,讲了一下缓存空值的坏处,布隆过滤器(2)和mysql的一致性,说用了延迟双删,后边追问延迟双删过程中出现缓存穿透怎么办?(有点懵,忘了自己说的啥了,只记得回答的不太好)(3)Redis持久化机制,详细讲了rdb和aof及其优缺点。(4)面试官追问:实际中是两者一起用,你对这个了解吗。(这个没怎么背过,只提了一下aof是记录指令更完整)4. MySQL相关(1)了解MySQL的锁吗(只列举了一下行锁,表锁,间隙锁,没追问)(2)影响sql语句执行效率的因素(讲了讲索引,回表查询等,提到索引失效的原因)(3)追问了一下类型转换导致索引失效,举例字符类型不加单引号‘’识别为数字,导致类型转换索引失效(4)实际操作中如何使sql更高效(怎么感觉有点重复,接着回答尽量使用索引,避免索引失效,建立联合索引,避免回表查询,防止select *等)(5)有时候MySQL优化器会导致sql执行和你想象的不一样,如何解决,让优化器按你的想法执行?(没见过,说不了解)(6)索引也有坏处,了解吗回答索引的本质是维护一个b+树,如果索引过多,就会影响增删改操作的效率5. 消息队列相关(1)面试官提到项目中用到Rabbitmq,我主动回答用来当延时队列(想让他问实现原理和死信交换机,不过没问)(2)消息队列消息丢失(回答生产者和消费者确认机制,消息持久化)(3)追问消息持久化如何实现(没见过,说不了解,这玩意不是直接在可视化界面直接打开的么😭)(4)还了解其他消息队列吗,为什么选用Rabbitmq有考虑过吗还了解卡夫卡,卡夫卡特点是吞吐量高,我们的项目体量较小不适合6. AOP(1)项目中用了AOP,具体业务场景答: 降低代码耦合,用于日志以及一些业务捆绑场景(2)AOP底层原理,只回答到动态代理cglib,对对象进行增强(3)AOP执行时间如何控制?根据业务场景选择执行在方法前还是方法后,如日志则方法前执行打印参数信息7. 其他(1)项目中有类似秒杀的场景,如何解决项目经历中学分管理系统活动名额模块,创建活动id和用户id唯一索引,防止重复注册,保证接口幂等性,同时将名额信息加载到Redis,永lua脚本原子性操作防止超卖现象(2)短时间高并发情况下压力大,如何解决答 使用Rabbitmq进行削峰填谷,因为项目并不是太注重时效性8. 反问阶段(1)面试表现,回答不能说(2)对我的建议以及有什么不足,说跟上一个问题差不多,也不能说(3)业务(4)这个岗位注重什么,回答实习生能带来外部改变与冲击(?第一次见这种说法)9. 总结一共接近四十分钟,感觉问的还挺多的,刚面完感觉绝大部分都回答的挺流畅,而且我回答八股的时候还都是结合项目说的,但是到现在一天多还没发结果有点慌了希望过过过
风间琉璃617:面试的时候说三天内出结果,结果拖到第七天通知也不发官网直接挂😓这些公司真是恶心完了
听到哪句话代表面试稳了O...
点赞 评论 收藏
分享
11-20 16:15
已编辑
武汉大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务