session.invalidate()无效的原因

2023-10-24 11:58

本文主要是介绍session.invalidate()无效的原因,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

起因

  今天做毕设的时候,写到了登录模块,同时用到了session来在前端展示用户名,因为用的是Springmvc做为Controller层的框架,所以设计到session的问题,想了想有没有简单的方法可以把模型取到的对象直接放入session中,网上查了一下用到了@SessionAttribute注解,这个注解我是直接如下使用的:

@Controller
@RequestMapping("/foodshare")
@SessionAttributes("user")
public class UserController {
..................
//上下省略代码model.addAttribute("user", user);
..................
}

  这样在前端使用起来非常方便可以跨页面取到用户的值:

${sessionScope.user.name}

问题

  于是也是这个注解惹的锅,我在写注销session的方法时怎么也无效,前端点退出登录按钮,跳转到如下的方法中,但是session并没有被销毁。。。。。解决了一下午才明白原来是@SessionAttribute的问题,所以你如果和我一样遇到了session.invalidate()方法无效的时候,看看是不是也是自己用了这个注解导致的呢?

//在Controller层里对应跳转的页面写了如下方法
session.invalidate()

解决方案

  先来讲一下@SessionAttributes原理:
  Springmvc在调用处理方法前,在请求线程中自动一个隐含的模型对象,调用所有在方法级别标注了@ModelAttribute的方法,并将方法返回值添加到隐含模型中,查看Session中是否存@SessionAttributes(“xxx”)所指定的xxx属性,如果有,将其添加到隐含模型中,如果隐含模型已经存在xxx属性,该步骤会覆盖隐含模型中已有的属性值。对应标注了@ModelAttribute(“xxx”)方法的入参按如下流程如果隐含模型包含了xxx属性,将其赋给该入参,再用请求消息填充该入参对象直接返回,否则如果xxx是会话属性,即处理类定义出标注了@SessionAttributes(“xxx”),则尝试从该会话中获取该属性,并将其值赋给入参,然后再用请求填充该入参对象,如会话中找不到xxx属性,则抛出HttpSessionRequiredException,如果隐含模型不存在xxx属性,且xxx也不是会话属性,则创建入参的对象实例,在用请求填充该入参。
  @SessionAttributes参数
  1、names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
  2、types:根据指定参数的类型,将模型中对应类型的参数存储到session中。
  3、value:其实和names是一样的。
  
 

  而要想清除@SessionAttributes,必须使用SessionStatus.setComplete();来清除。注意,它只清除@SessionAttributes的session,不会清除HttpSession的数据。
  
  而要想清除@SessionAttributes,必须使用SessionStatus.setComplete();来清除。注意,它只清除@SessionAttributes的session,不会清除HttpSession的数据。

  而要想清除@SessionAttributes,必须使用SessionStatus.setComplete();来清除。注意,它只清除@SessionAttributes的session,不会清除HttpSession的数据。
  重要的事情说三遍- -!!!看到这里大家应该知道问题的所在,@SessionAttributes 自动又把user属性添加回session里面去了。
  所以我们只需要在注销session的方法中这样写即可:

    public String outLogin(HttpSession session,SessionStatus sessionStatus){session.removeAttribute("user");//我这里是先取出httpsession中的user属性session.invalidate();  //然后是让httpsession失效sessionStatus.setComplete();//最后是调用sessionStatus方法return "index";}

参考文章

http://www.cnblogs.com/caoyc/p/5635914.html

http://www.92to.com/bangong/2017/01-22/16508586.html

这篇关于session.invalidate()无效的原因的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274997

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

71-java 导致线程上下文切换的原因

Java中导致线程上下文切换的原因通常包括: 线程时间片用完:当前线程的时间片用完,操作系统将其暂停,并切换到另一个线程。 线程被优先级更高的线程抢占:操作系统根据线程优先级决定运行哪个线程。 线程进入等待状态:如线程执行了sleep(),wait(),join()等操作,使线程进入等待状态或阻塞状态,释放CPU。 线程占用CPU时间过长:如果线程执行了大量的I/O操作,而不是CPU计算

笔记本电脑开机报错故障的原因及解决办法

笔记本电脑开机报错故障是指笔记本电脑开机自检时或启动操作系统前停止启动,在显示屏 出现一些错误提示的故障。   笔记本电脑开机报错故障的原因及解决办法   造成此类故障的原因一般是笔记本电脑在启动自检时,检测到硬件设备不能正常工作或在自 检通过后从硬盘启动时,出现硬盘的分区表损坏、硬盘主引导记录损坏、硬盘分区结束标志丢失 等故障,笔记本电脑出现相应的故障提示。   维修此类故障时

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

图片地址携带blob:的原因

图片地址携带blob:的原因与Blob对象(Binary Large Object)的使用有关。Blob对象代表了一个不可变的、原始数据的类文件对象,通常用于处理二进制数据,如图片、视频或音频文件等。在计算机中,Blob常用于数据库中存储二进制文件,但在Web开发中,Blob对象也被广泛用于前端处理二进制数据。 具体来说,当图片地址携带blob:时,这通常意味着图片数据是以Blob对象的形式存储

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类class User(UserMixin):def __init__(self, id):self.id = id@app.route('/login')def login():# 模拟用户登录过程user

真实案例分享:零售企业如何避免销售数据的无效分析?

在零售业务的数据分析中,无效分析不仅浪费时间和资源,还可能导致错误的决策。为了避免这种情况,企业必须采取策略来确保他们的数据分析工作能够产生实际的商业价值。本文将通过行业内真实的案例,探讨零售企业如何通过精心设计的数据策略和分析方法,借助商业智能BI工具,避免销售数据的无效分析,确保每一次分析都能为业务增长提供有力的支持。 文章中提到的BI数据分析工具分享给大家—— https://s.fan