注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

关于Session already invalidated分析  

2011-10-19 22:48:10|  分类: VC C++ MFC JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

关于Session already invalidated分析

Posted on 2007-12-17 by leaderbird

各位,曾经有朋友经常会给我反映一个问题,就是系统偶尔会出现:
java.lang.IllegalStateException: getAttribute: Session already invalidated
这个错!
这个问题主要是出在当你用session.getAttribute("XXX")时出现的,这个问题主要是因为你在使用session.getAttribute("XXX")这个方法之前做了一个session.invalidate()处理,既然,你已经把session给invalidate掉了,那么你再用session.getAttribute("XXX")方法当然会出现上面所提示的错误了!
解决方法是:将session.invalidate()去掉,如果你认为一定要做这个处理的话,就请你在做调用session.getAttribute(),方法之前先做一个关于session的判断或者是做一个异常处理!
关于日常开发中更多一些问题大家都可以上我的博客:http://leaderbird.blogcn.com
或者E-Mail给我   lsl-120@163.com
QQ:313284732
leaderbird  李小强

 

对异常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解

分类: Java 2011-09-16 10:14 142人阅读 评论(0) 收藏 举报

最近项目日志中总是抛出异常

                                  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无效,在这里进行页面跳转,返回到登录页面

    }

以上就是,想跟大家分享的一点经验,希望多大家有所帮助。。。。

分享到:

  • 上一篇:使用javamail发送HTML邮件
  •   评论这张
     
    阅读(4251)| 评论(1)
    推荐 转载

    历史上的今天

    在LOFTER的更多文章

    评论

    <#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    页脚

    网易公司版权所有 ©1997-2017