我正在使用HttpSessionBindingListener
的valueUnbound方法在会话即将到期之前释放锁(数据库中的一个条目):
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
String user = (String) event.getSession().getAttribute("currentUsr");
removeLock(user);
}
设置锁定后,我将用户名设置为会话变量 我在删除锁定方法中需要这个“用户名”。但是getAttribute抛出异常:
java.lang.IllegalStateException:getAttribute:会话已经失效
我需要帮助才能获得会话变量?或者有没有其他方法来获取用户名?
不,因为会话已失效。
虽然,我想出了解决方案,但我通过servlet上下文设置了属性 valueBound方法并通过: event.getSession()。getServletContext()。getAttribute(“cUser”);
它工作正常。谢谢EJP
我得到你的观点EJP,你是对的,我让它变得复杂,我可以从event.getValue()得到它。给你答案+1,谢谢。
答案 0 :(得分:2)
虽然,我想出了解决方案,但我在valueBound方法中通过servlet上下文设置属性并通过:
获取它event.getSession().getServletContext().getAttribute("cUser");
所以..您正在应用程序范围中存储会话范围的数据。您是否意识到这种方式是在webapp的所有访问者之间共享数据?访问者X然后将看到访问者Y设置的属性,该访问者Y稍后访问了该网站。它使问题变得更糟。
无论如何,至于具体问题,正如异常消息试图告诉你的那样,会话已经在那时失效了。有两种方法可以解决这个问题:
使currentUsr
成为实现HttpSessionBindingListener
的类的属性,这样您就不需要将其作为独特的会话属性来获取。< / p>
请改用HttpSessionListener
。 {/ 1}}方法在失效之前被称为,因此您仍然可以访问所有属性。