会话无效时,会话被破坏

时间:2013-02-14 03:34:18

标签: jsf-2 cdi invalidation httpsession conversation-scope

我有 SessionManager ,它实现了 HttpSessionListener 。在 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的正常行为吗?它似乎与我无效的会议有关。

1 个答案:

答案 0 :(得分:3)

来自official documentation

的引用
  

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