对异常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解 .
来源:互联网 发布:免费交友恋爱软件 编辑:程序博客网 时间:2024/04/30 03:03
最近项目日志中总是抛出异常
java.lang.IllegalStateException: getAttribute: Session already invalidated
经调查发现,问题出在HttpSession session.getAttribute("paramName");这个方法执行时。
异常原因为:从Session中获取属性值的时候,Session已经无效。
有两种可能导致Session无效(1)Session timeout;(2)程序中调用了session.invalidate()方法。
搜索了整个项目Code,发现在用户注销的过程中的确执行了session.invalidate()方法。
考虑发生此种情况的场景一:
1)用户在多个IE实例中使用同一个帐号登录了系统,此时多个IE实例的用户处于同一个Session会话中。
2)用户在一个IE实例窗口中进行了注销操作(此项目中,注销操作被执行后,IE窗口被程序自动关闭),此时,session.invalidate()方法被调用,session处于无效状态。
3)此时,可能用户打开的另为一个IE实例窗口中正在进行数据录入操作,填写了必要字段后,用户提交。
4)业务层,通过传递pageContext实例,访问本次session,并调用session.getAttribute();方法获取登录用户的ID,用户记录记录修改人。
这时,由于session已经处于无效状态,导致方法session.getAttribute();调用抛出以上描述的异常。
异常场景二:
项目中的jsp页面结构如下
abc.jsp
********************************
<%@ include file="/home/include.jsp" %>
...
本jsp页面的处理代码
********************************
而include.jsp页面的代码如下:
<%@page import="com.trustmart.webapp.menu.CookieProcess"%><%@taglib uri="/Ap_WMC/input" prefix="input"%><%@taglib uri="/Ap_WMC/ui" prefix="ui"%><%@taglib uri="/Ap_WMC/db" prefix="db"%><jsp:useBean id="user" class="com.trustmart.webapp.User" scope="session"/><%if(user.getUserName()==null){%> <script language="JavaScript"> parent.location="/Ap_WMC/home/menu.jsp?relogin=1&mode=<%=mode%>"; </script><% return;}%>
通过声明在session范围内的javabean User来判断会话是否过期
这样,action被提交时:
首先在include.jsp页面中进行session有效性判断;
接着abc.jsp的业务代码中会访问session来获取User实例。
考虑这样一种情况:
1)用户session将在1秒后timeout;
2)此时用户正好执行了abc.jsp的提交动作,此时在include.jsp判断的时候,session正好是有效的
3)但是,当执行到abc.jsp的action业务逻辑代码session.getAttribute()时,session正好失效,异常发生。
我想,这种情况在实际中极有可能发生(用户在session即将timeout的前1-2秒submit),而在实际的生产环境中,一次request由于网络原因不能在1-2s中得到响应也很平常。
对于本项目中的情况而言,判断session是否有效的代码,和接下来执行session.getAttribute()方法距离太远,中间需要执行很多其他的代码,这进一步
增加了以上描述的情况发生的可能性。
用户场景模拟:
1)打开两个IE浏览器实例,使用同一账户登录系统
2)在一个IE实例一中,进行abc.jsp页面的提交动作,并在session.getAttribute()方法处设置断点,等待在另为一个IE实例中执行注销动作
3)在E实例二中执行注销动作
4)回到IE实例一,在断点处继续执行,异常重现
...
Caused by: java.lang.IllegalStateException: getAttribute: Session already invalidated
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
以下是解决此异常的方法:
考虑到这里的情况,那就必须在abc.jsp的业务处理代码中session.getAttribute()方法执行前再进行一次session有效性判断,代码如下:
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
//传递参数true,那么当session过期时,新的session被创建,接下来可通过session.isNew()的返回值来判断是不是同一个session
//返回值为:true,新的session被创建,action提交执行时的那个用户session已经无效
//返回值为:false,同一个session,仍然有效
HttpSession session = request.getSession(true);
if (session.isNew()) {
//session无效,在这里进行页面跳转,返回到登录页面
}
以上就是,想跟大家分享的一点经验,希望多大家有所帮助。。。。
- 对异常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解
- 对异常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解 .
- 对异常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解
- java.lang.IllegalStateException: getAttribute: Session already invalidated
- java.lang.IllegalStateException: getAttribute: Session already invalidated
- 【session】java.lang.IllegalStateException: getAttribute: Session already invalidated
- 处理异常getAttribute: Session already invalidated
- java.lang.IllegalStateException: Fragment already added异常的处理
- java.lang.IllegalStateException: Fragment already added ListFragment异常的处理
- java.lang.IllegalStateException: Fragment already added异常的处理
- Android java.lang.IllegalStateException: Fragment already added异常的处理
- java.lang.IllegalStateException: Fragment already added异常的处理
- java.lang.IllegalStateException: Fragment already added异常的处理
- 异常:java.lang.IllegalStateException: Fragment already active
- 异常:java.lang.IllegalStateException: Fragment already active
- 对java.lang.IllegalStateException异常发生的原因简述
- 简单理解java.lang.IllegalStateException异常
- Android运行异常二:java.lang.IllegalStateException: Fragment already active
- 引用作为函数返回值
- svn:无法使用外部编辑器获得日志信息;考虑设置环境变量$SVN_EDITOR
- Hi3531添加16GByte(128Gbit) NAND Flash支持
- 堆栈大小设置问题
- redis数据库之主从复制
- 对异常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解 .
- Linux下SVN命令使用大全
- Android:Activity和ProgressBar共存时停止顺序问题
- AppBox_v2.0完整版免费下载,暨AppBox_v3.0正式发布!
- JSP 中文乱码
- JQuery中$.ajax()方法参数详解
- WPF中XMAL对象属性赋值及属性类型转换机制
- linux进程地址空间(2) 缺页异常详解(2)请求调页详解
- css float