使特定的 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 都被销毁,我只想使一个特定的 "Managed" bean 失效,我该怎么做?
忽略你不清楚你想如何实施这个解决方案的事实,开始
将 BeanManager
注入到您计划执行逻辑的任何位置。它必须是一个托管组件
@Inject
BeanManager beanManager;
bean 管理器是允许您访问上下文中所有 CDI bean(和其他东西)的组件。
然后使用 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();
如何使会话中的特定 bean 无效?
我有这个示例代码。 我测试 ExternalContext.invalidateSession();但它会破坏应用程序会话中的所有 bean,因为它会破坏整个会话。
@Named
@SessionScoped
class Managed implements Serializable {
public void invalidate (){
// lines //
externalContext.invalidateSession();
}
}
但是,使用 invalidateSession 会话中的所有 bean 都被销毁,我只想使一个特定的 "Managed" bean 失效,我该怎么做?
忽略你不清楚你想如何实施这个解决方案的事实,开始
将
BeanManager
注入到您计划执行逻辑的任何位置。它必须是一个托管组件@Inject BeanManager beanManager;
bean 管理器是允许您访问上下文中所有 CDI bean(和其他东西)的组件。
然后使用
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();