繁体   English   中英

使特定的jsf bean会话无效

[英]Invalidate specific jsf bean session

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

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

@Named
@SessionScoped
class Managed implements Serializable {

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

}

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

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

  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很可能会按需创建一个全新的实例

虽然使用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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM