我有 SessionManager ,它实现了 HttpSessionListener 。在 SessionManager 中,我有一个所有活动会话的静态哈希表。我正在尝试创建一个强制会话失效的功能。它看起来像:
HttpSession session = sessionRegistry.get(key);
session.invalidate();
这绝对是我想要它做的,即破坏目标会话。但是,它似乎对我的 @ConversationScoped 托管bean产生了副作用。
在我的 ConversationBean 中,我有一个包含某些值的属性。我刚刚注意到,在 sessionRegistry 中使会话失效后,ConversationBean上存储的值将被销毁。
----编辑------
此示例演示了我想要实现的目标:
假设我有一个应用程序作用域哈希表 sessionRegistry ,包含以下值:
Key | Value
---------------------
1 | HttpSession1
2 | HttpSession2
3 | HttpSession3
我以管理员身份登录。现在我相信我有一个不同的会话,让我们说HttpSession4。我想尝试从应用程序作用域哈希表中踢出一些会话,我这样做:
HttpSession session = sessionRegistry.get(1);
session.invalidate();
当我登录 HttpSession4 时,我销毁了 HttpSession1 。根据我的理解,HttpSession1的对话应该用它来销毁,而不是当前的对话,它应该与HttpSession4相关联。
我的问题是,这真的是 @ConversationScoped 托管bean的正常行为吗?它似乎与我无效的会议有关。
答案 0 :(得分:3)
当HTTP servlet会话失效时,在servlet service()方法完成后,将破坏当前会话期间创建的所有长时间运行的会话上下文。