1

HttpSessionBindingListener在会话即将到期之前,我正在使用 valueUnbound 方法释放锁(来自数据库的条目):

@Override

public void valueUnbound(HttpSessionBindingEvent event) {
  String user = (String) event.getSession().getAttribute("currentUsr");
  removeLock(user);
}

设置锁定后,我将用户名设置为会话变量。
我在删除锁定方法中需要这个“用户名”。但是 getAttribute 抛出异常:

java.lang.IllegalStateException:getAttribute:会话已经失效

我需要帮助来获取会话变量??或者有没有其他方法可以获取用户名?


不,因为会话已失效。

虽然,我想出了解决方案,但我在 valueBound 方法中通过 servlet 上下文设置属性并通过 event.getSession().getServletContext().getAttribute("cUser");

它工作正常。谢谢 EJP


我明白了你的观点 EJP,你是对的,我让它变得复杂,我可以从 event.getValue() 中得到它。+1 对您的回答,谢谢。

4

1 回答 1

2

虽然,我想出了解决方案,但我在 valueBound 方法中通过 servlet 上下文设置属性并通过以下方式获取它:event.getSession().getServletContext().getAttribute("cUser");

所以..您将会话范围的数据存储在应用程序范围内。您是否意识到通过这种方式在webapp的所有访问者之间共享数据?然后访问者 X 将看到访问者 Y 设置的属性,该访问者稍后访问了该网站。它只会让问题变得更糟。

无论如何,至于具体问题,正如异常消息试图告诉您的那样,该会话此时已经失效。有两种方法可以解决这个问题:

  1. 为正在实现的类currentUsr创建一个属性HttpSessionBindingListener,这样您就不需要将其作为不同的会话属性来获取。

  2. 改用 a HttpSessionListener。该sessionDestroyed()方法在失效之前被调用,因此您仍然应该可以访问所有属性。

于 2011-07-11T10:03:32.660 回答