对java.lang.IllegalStateException异常发生的原因简述

对java.lang.IllegalStateException异常发生的原因简述

最近项目日志中总是抛出异常
 
                                  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无效,在这里进行页面跳转,返回到登录页面
 
    }
 以上就是,想跟大家分享的一点经验,希望多大家有所帮助。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`java.lang.IllegalStateException` 是一个运行时异常,通常发生在代码尝试在不合适的时间调用某个方法或操作。以下是几种可能导致该异常的情况和解决方法: 1. 操作状态错误:当尝试在未准备好的状态下执行某个操作时,将抛出 `IllegalStateException`。例如,在视图还没有完成布局之前尝试访问视图的大小或位置。解决方法是确保在执行任何操作之前,所有必要的资源都已准备好,如使用 `View.post()` 方法在视图完成布局后再进行操作。 2. 资源已释放:当尝试使用已经被释放的资源或对象时,将抛出 `IllegalStateException`。例如,在使用已经关闭的数据库连接或已经释放的线程池执行任务时,都会导致该异常。解决方法是确保资源在使用之前都处于可用状态,并且在使用后及时释放资源。 3. 状态转换错误:当尝试从一个状态转换到另一个状态时,如果状态转换不合法,则会抛出 `IllegalStateException`。例如,在 `MediaPlayer` 对象还没有准备好时尝试播放音频文件,将抛出该异常。解决方法是确保在进行状态转换之前,所有必要的操作和条件都已满足。 4. 数据格式错误:当尝试使用不正确的数据格式或类型时,将抛出 `IllegalStateException`。例如,在尝试将一个非数字字符串转换为数字时,将抛出该异常。解决方法是确保使用正确的数据格式和类型进行操作,并进行必要的数据类型转换。 总之,要避免 `IllegalStateException` 异常,需要仔细检查代码中所有操作的前提条件和后置条件,并确保在进行任何操作之前,所有必要的资源和条件都已准备好。同时,需要合理地处理异常情况,以避免程序崩溃或出现不可预期的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值