2012-12-09 21 views
1

好的。当我更新用户时,我想要做的是能够使其当前拥有的任何会话无效,以强制刷新凭证。我不在乎能够直接访问特定于会话的用户数据。理想情况下,我也可以通过类似的方式将用户限制在一个会话中。存储并使不同用户的Java HttpSession失效

我试着做的是使用用户名作为键和HttpSession作为值创建一个HashMap(我的实际设置是多一点涉及,但经过反复看似莫名的失败,我把它煮到这个简单的测试)。然而,每当我试图告诉检索到的HttpSession失效时,它似乎会使当前的[admin]会话失效。 HttpSession是否与当前请求不可分割地绑定?

还是有一个完全不同的方式来处理这个?

如果碰巧重要,我使用Jetty 6.1.26。

回答

1

有没有简单的方法。我能想到的最简单的方法是在数据库(或cahche)上保留一个标志,并检查每个请求的有效性。

或者你可以实现一个HTTP Session侦听器,并保持可以访问和失效的用户会话的HashMap。

我还没有尝试过这些,所以我不知道任何性能问题。但对大多数应用程序来说应该是可以接受

+0

这几乎就是我的设置(会话监听器)。问题是在调用session.invalidate()时,它使我无效的会话无效,而不是目标会话。我的想法是在会话范围的bean中设置一个无效标志,并使用一个方面来验证并从那里无效。或者我想我可以从请求范围的bean中进行验证。无论哪种方式,它使我到相同的地方(取决于方面或实例化是否首先发生)。 – Apropos

+0

当你从该地图的其他用户的会话中调用invalidate时,你是唯一一个失效的人吗?也许你的会议是在地图上,它也是无效的...... – Thihara

+0

是的。目标会议保持不变。 – Apropos

0

那么,据我所知,这是没有办法的。使用请求范围的bean没有像我期望的那样工作(尽管它给了我很好的洞察Spring如何操作,拦截字段访问)。我最终在SessionHandler(一个会话范围的bean)上使用了一个脏标志,并且使用了非常高优先级的方面检查,并且必要时在用户的下一个请求中在会话中调用invalidate()。我仍然最终让所有的SessionHandlers注册了一个SessionManager,还有一个@PreDestroy方法来注销它们,以避免地图中的一堆空条目。