Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 753|回复: 0

[jsp学习]处理异常getAttribute: Session already invalidated

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-2 11:10:46 | 显示全部楼层 |阅读模式
    最近项目日志中总是抛出异常  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

    &times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;

    以下是解决此异常的方法:

    考虑到这里的情况,那就必须在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无效,在这里进行页面跳转,返回到登录页面

    }

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

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 22:12 , Processed in 0.470775 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表