我有一个实现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 的正常行为吗?它似乎与我无效的会话相关联。