【问题标题】:need session variables in valueUnbound?需要 valueUnbound 中的会话变量?
【发布时间】:2011-10-02 00:41:36
【问题描述】:

我正在使用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 对您的回答,谢谢。

【问题讨论】:

  • 请不要使用 cmets 的答案。谢谢。

标签: jsf-2 session-variables session-timeout spring-webflow-2


【解决方案1】:

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

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

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

  1. 使currentUsr 成为实现HttpSessionBindingListener 的类的属性,这样您就不需要将其作为不同的会话属性来获取。

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

【讨论】:

  • 我实现了第一个,它运行顺利。谢谢你的解释。今天学到了新东西:)。谢谢@BalusC
  • 不客气。由于您是新来的,请不要忘记标记已接受的答案,这有助于(最)解决问题。另见meta.stackexchange.com/questions/5234/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
相关资源
最近更新 更多