HttpSession 的 invalidate() 方法介绍

简介: HttpSession 的 invalidate() 方法介绍

Javadoc

/**
 * Invalidates this session then unbinds any objects bound
 * to it.
 *
 * @exception IllegalStateException    if this method is called on an
 *                    already invalidated session
 */
public void invalidate();

从javadoc来看,某Session对象调用该方法以后会做两件事情:

  1. 使该Session无效

  2. 将该Session绑定的对象全部解绑


Experiment

上面两条:使Session无效和解绑绑定的对象,可能让你听得一头雾水。

下面我们就做个小实验,看下执行invalidate() 方法会发生些什么。

在Controller中,利用参数中的HttpServletRequest执行如下代码:

HttpSession session=request.getSession();

session.setAttribute("tao", "good boy");

System.out.println("before invalidate:"+session.getId()+"-"+session.getAttribute("tao"));

session.invalidate();

System.out.println("after  invalidate:"+session.getId());

HttpSession s1=request.getSession(false);
System.out.println("s1:"+s1);

HttpSession s2=request.getSession(true);
System.out.println("s2 id:"+s2.getId());

HttpSession s3=request.getSession();
System.out.println("s3 id:"+s3.getId());

HttpSession s4=request.getSession(false);
System.out.println("s4 id:"+s4.getId());

//session.getAttribute("tao");
//session.setAttribute("tao", "good boy");

控制台输出的内容如下:

before invalidate:h7p0lnh08fe415ro1o43lwl4w-good boy
after  invalidate:h7p0lnh08fe415ro1o43lwl4w
s1:null
s2 id:ztx2uk2776612wbzjt9wo30d
s3 id:ztx2uk2776612wbzjt9wo30d
s4 id:ztx2uk2776612wbzjt9wo30d

如果此时利用原来的session对象再次执行session.getAttribute("tao")或者session.setAttribute("tao", "good boy"),会抛出如下异常:

Caused by: java.lang.IllegalStateException
    at org.eclipse.jetty.server.session.AbstractSession.checkValid(AbstractSession.java:106)
    at org.eclipse.jetty.server.session.HashedSession.checkValid(HashedSession.java:79)
    at org.eclipse.jetty.server.session.AbstractSession.getAttribute(AbstractSession.java:459)

Summary

结合 invalidate() 方法的javadoc,再通过上面的实验,我们可以对invalidate()方法的作用归结如下:

  1. 调用invalidate() 方法会使该Session无效,无效只是不能调用setAttribute或者getAttribute之类的方法了,Session对象还在;

  2. 调用过invalidate()方法的Session对象如果再执行setAttribute或者getAttribute方法会抛出IllegalStateException

  3. 调用invalidate() 方法会将该Session绑定的对象全部解绑,因此如果调用request.getSession(false)方法,返回值会是null——即此时request没有绑定任何Session;

  4. 如果调用invalidate() 方法后执行request.getSession()或者request.getSession(true),那么此时会创建一个新的Session给该Request对象绑定;需要特殊说明的是,getSession()无参和参数为true的效果是一样的,并且此时如果你再次执行request.getSession(false)方法,返回的就不是null了,而是上面新创建的Session对象。


Thinking

通过上面的介绍,你应该对invalidate()方法的作用已经了如指掌了,那么接下来的问题是:什么时候需要调用这个方法呢?

最常见的地方是退出登录,因为一般情况下当用户退出登录以后,为了保证登陆后产生的数据在退出以后不会因非法获取到SessionId而泄露,就要通过invalidate()方法来解绑该Session绑定的所有数据。

虽然通过session.removeAttribute("tao")也可以删除存在Session中的属性,但与SessionId绑定的相关的浏览记录还可能在客户端保存着,另外,removeAttribute难免有漏网之鱼而且也不优雅。

好比方说,一个人干了一件坏事,也许可以通过销毁证据来掩盖真相,当这个人作恶多端、臭名远扬的时候,只好换个身份过活了。

今天我们生活在一个万物互联的时代,即使不上网,走在路上,每天可能会被监控拍到几十次,如果我们想在这个互联网时代退出登录还有可能吗?

以前看美剧超感猎杀(Sense8),黑客女主人公(变性之前是小帅哥)为了躲避警方的通缉,选择了E-Death。

也许只有我们每个人都可以选择E-DEATH的时候,才能真正的在这个互联时代invalidate吧......

在这里插入图片描述


Links

目录
相关文章
|
Java API Maven
【现成工具】java获取国家法定节假日包含指定月份节假日和周末
【现成工具】java获取国家法定节假日包含指定月份节假日和周末
4101 0
|
人工智能 安全
Sora内测资格申请保姆级教程,附申请提示词
快去申请,不知道什么时候会关闭,早就是优势
5193 3
|
11月前
|
机器学习/深度学习 人工智能 运维
《人工智能赋能网络拓扑分析:洞察关键节点与脆弱链路》
在数字化时代,网络作为现代社会的神经中枢,其关键节点与脆弱链路对性能和稳定性至关重要。传统方法在识别这些要素时面临局限,而人工智能技术(如机器学习、深度学习和强化学习)提供了新解决方案。通过分析网络拓扑数据,AI能精准识别关键节点与脆弱链路,优化资源配置并提升网络可靠性。实践案例表明,AI已显著改善互联网公司和智能交通网络的运维效率。未来,随着算法优化和技术融合,AI将在复杂网络中发挥更大作用,推动社会信息化迈向新高度。
321 2
|
JavaScript 开发者 UED
数据驱动方式的优缺点
【10月更文挑战第13天】 数据驱动是软件开发中,特别是在 Vue 等框架中的一种重要理念。它通过数据绑定简化代码结构,提高开发效率和可维护性,增强用户体验,促进团队协作,并提升性能和灵活性。然而,也存在初始学习成本高、数据绑定复杂、内存管理问题及调试难度大等挑战。总体而言,数据驱动在现代应用开发中具有显著优势,但也需谨慎应对潜在问题。
|
机器学习/深度学习
ProCo: 无限contrastive pairs的长尾对比学习——TPAMI 2024最新成果解读
【10月更文挑战第3天】《ProCo: Infinite Contrastive Pairs for Long-Tailed Contrastive Learning》是TPAMI 2024的最新成果,针对现实世界图像数据中的长尾分布问题,提出了一种通过生成无限对比对来提升模型效果的方法。ProCo包括构建原型网络、生成对比对、设计对比损失函数及优化策略。实验结果显示,ProCo在多个长尾数据集上显著优于现有方法。此外,还提供了简化版示例代码,便于读者理解和应用。未来,该领域有望涌现更多创新研究。
365 3
|
机器学习/深度学习 算法 数据挖掘
【白话机器学习】算法理论+实战之决策树
【白话机器学习】算法理论+实战之决策树
445 0
|
Java Maven Spring
【IntelliJ IDEA】使用Maven方式构建Spring Boot Web 项目(超详细)2
【IntelliJ IDEA】使用Maven方式构建Spring Boot Web 项目(超详细)
3513 3
|
Cloud Native 安全 Devops
核心系统转型问题之数字化韧性的定义如何解决
核心系统转型问题之数字化韧性的定义如何解决
|
算法 IDE 开发工具
通义灵码插件的优化建议
通义灵码是基于阿里云通义大模型的编码辅助工具,旨在提升开发者效率。为更好地满足开发需求,提出以下优化建议:1)提升生成速度,优化算法,引入分批处理;2)增强跨文件感知能力,理解代码上下文;3)完善云服务支持,深化与阿里云服务集成;4)丰富功能体验,增加编程语言支持;5)提升稳定性和兼容性,确保多环境运行;6)优化用户界面和交互,提供自定义选项;7)增加用户反馈渠道和社区支持,建立开发者交流平台。通过这些改进,通义灵码将为开发者带来更高效智能的编码体验。【6月更文挑战第1天】
564 2