0

我有一个实现HttpSessionListener的SessionManager。在SessionManager中,我有一个所有活动会话的静态哈希表。我正在尝试创建一个强制会话无效的函数。它看起来像:


HttpSession session = sessionRegistry.get(key);
session.invalidate();


这绝对是我想要做的,那就是破坏目标会话。但是,它似乎对我的@ConversationScoped托管 bean 有副作用。

在我的ConversationBean中,我有一个拥有一些价值的属性。我刚刚注意到,在sessionRegistry中的会话无效后,存储在 ConversationBean 上的值被破坏。

  • 我正在使另一个会话无效(来自sessionRegistry而不是当前会话)
  • 我在会话无效之前和之后打印了来自ConversationBean的值,它仍然存在。只有当我离开显示活动会话列表的@ViewScoped页面时,它才会被销毁。(使用@PreDestroy捕获它)
  • 此外,在@ViewScoped bean 的@PreDestroy注释方法上,我尝试打印对话 ID,但它已经无效。是的,ConversationBean的哈希码也不同,这意味着它与我调用session.invalidate之前的实例不同。


- - 编辑 - - -

这个例子展示了我想要实现的目标:

假设我有一个应用程序范围的哈希表sessionRegistry,具有以下值:

Key | Value
---------------------
1   | HttpSession1 
2   | HttpSession2 
3   | HttpSession3 


我以管理员身份登录。现在我相信我有一个不同的会话,比如说 HttpSession4。我想尝试从应用程序范围的哈希表中启动一些会话,我这样做:

HttpSession session = sessionRegistry.get(1);
session.invalidate();


我在登录HttpSession4时 销毁了HttpSession1。在我的理解中,HttpSession1 的会话应该被销毁,而不是当前会话,它应该与 HttpSession4 相关联。


我的问题是,这真的是@ConversationScoped托管 bean 的正常行为吗?它似乎与我无效的会话相关联。

4

1 回答 1

3

引用官方文档

当 HTTP servlet 会话无效时,在 servlet service() 方法完成后,在当前会话期间创建的所有长时间运行的会话上下文都将被销毁。

于 2013-02-14T10:35:46.673 回答