【问题标题】:Invalidate specific jsf bean session [duplicate]使特定的jsf bean会话无效[重复]
【发布时间】:2016-11-18 23:58:36
【问题描述】:

如何使会话中的特定 bean 无效?

我有这个示例代码。 我用 ExternalContext.invalidateSession(); 测试但它会破坏应用程序中会话中的所有 bean,因为它会破坏整个会话。

@Named
@SessionScoped
class Managed implements Serializable {

       public void invalidate (){
           // lines //
           externalContext.invalidateSession();   
       }

}

但是,使用 invalidateSession 会话中的所有 bean 都被销毁,我只想使一个特定的“托管”bean 无效,我该怎么做?

【问题讨论】:

  • 所以你想从同一个 bean 中使一个 bean 无效?
  • 我只想用 externalContext.invalidateSession(); 使 bean 无效它使所有会话无效,但我只想使特定会话无效。

标签: jsf jakarta-ee cdi


【解决方案1】:

忽略您不清楚要如何实施此解决方案这一事实,开始

  1. BeanManager 注入您计划执行逻辑的任何位置。它必须是一个托管组件

    @Inject
    BeanManager beanManager;
    

    bean 管理器是授予您访问上下文中所有 CDI bean(和其他东西)的组件。

  2. 然后您使用BeanManager 获取您感兴趣的bean 的上下文引用

    Bean<Managed> bean = (Bean<Managed>) beanManager.resolve(beanManager.getBeans(Managed.class));
    Managed managedBean= (Managed) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean)
    
    managedBean = null; //or whatever you want to do with it
    

此解决方案应销毁该会话 bean 的活动实例;如果再次尝试使用同一个 bean,CDI 很可能会按需创建一个全新的实例

【讨论】:

    【解决方案2】:

    虽然BeanManager 的方法是可行的,但我建议稍微不同的方法。

    您应该能够将@Inject HttpSession 放入您的托管@SessionScoped bean,然后在该会话中调用invalidate()

    类似的东西:

    @Named
    @SessionScoped
    class Managed implements Serializable {
           @Inject
           HttpSession session;
    
           public void invalidate (){
               session.invalidate(); //invalidates current session  
           }    
    }
    

    实现此目的的另一种方法是使用FacesContext。你走在正确的轨道上,但你需要多做一步:

    ((HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true)).invalidate();
    

    【讨论】:

    • 来自原始问题:“我使用 ExternalContext.invalidateSession() 进行测试;但它会破坏应用程序中的所有会话。”。对于“所有会话”,OP 表示会话中的所有 bean。
    • 你可能想对他的问题投反对票而不是我的回答?因为如果像你说的那样,这个问题本身就很不准确。不管怎样,谢谢你告诉我。
    • 不,因为从原始评论和赞成和接受的答案来看,很明显意图是什么。至少对我来说也是如此。您实际上已经在回答中确切地知道了 OP 已经在做什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2011-09-18
    • 2011-02-03
    • 1970-01-01
    • 2013-09-13
    • 2015-10-18
    相关资源
    最近更新 更多