处理异常getAttribute: Session already invalidated

本文分析了在项目中遇到的java.lang.IllegalStateException:getAttribute:Sessionalreadyinvalidated异常的原因,包括Session超时与主动销毁两种情况,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.java3z.com/cwbwebhome/article/article8/83499.html?id=4560


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

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

}

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


### 关于 TongWeb5 中 PWC2786 错误的原因分析 PWC2786 错误通常表明在尝试调用 `removeAttribute` 方法时,会话(session)已经被销毁或失效。这种问题可能由多种因素引起,包括但不限于以下几种情况: #### 1. **会话超时** 如果用户的会话由于长时间未活动而被自动销毁,则后续对该会话的操作可能会触发此错误。TongWeb 的默认会话超时时长可以通过配置文件调整[^3]。 #### 2. **手动销毁会话** 某些情况下,程序逻辑可能导致显式调用了 `invalidate()` 方法来销毁当前会话。一旦会话被销毁,任何进一步的属性操作都会引发该异常[^4]。 #### 3. **多线程竞争条件** 当同一会话在同一时间被多个请求访问并修改时,可能出现竞态条件。例如,在一个线程中销毁了会话,而在另一个线程中仍然试图对其进行读写操作[^5]。 --- ### 解决方案 以下是针对上述原因的具体解决方法: #### 配置会话管理参数 通过设置启动脚本来控制会话的行为。例如,可以启用共享会话功能以减少因频繁创建和销毁会话而导致的问题: ```bash -DSharedSessionContext=true -DSharedSessionEnable=true ``` 这将允许不同应用程序之间共享同一个会话实例,从而降低会话无效化的可能性[^1]。 #### 调整会话超时时间 检查并适当延长 Tomcat 或 TongWeb 的会话超时时间。可以在 `web.xml` 文件中定义全局范围内的会话过期策略: ```xml <session-config> <session-timeout>30</session-timeout> <!-- 单位为分钟 --> </session-config> ``` 对于特定的应用场景,也可以动态设定会话的有效期限: ```java HttpSession session = request.getSession(); session.setMaxInactiveInterval(1800); // 设置最大不活跃时间为 1800 秒 (即 30 分钟) ``` #### 修改代码逻辑避免重复操作 确保不会多次调用 `invalidate()` 方法或者在已经无效化后的会话上执行额外的方法调用。例如,在删除某个会话属性之前先验证其有效性: ```java if (session != null && !session.isNew() && session.getAttribute("attributeName") != null) { session.removeAttribute("attributeName"); } ``` 此外,应尽量避免跨线程共享单一会话对象,除非采取同步机制保护数据一致性[^5]。 #### 日志排查与调试工具 利用日志记录定位具体发生位置,并结合性能监控工具找出潜在瓶颈所在。开启详细的跟踪模式可以帮助快速发现问题根源: ```properties org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true ``` --- ### 总结 综上所述,PWC2786 错误主要是因为非法访问了一个已被标记为无效的状态下的 HTTP 会话所引起的。通过对服务器端参数优化以及改进客户端交互流程能够有效缓解此类现象的发生频率][^[^34]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值