当前位置: 首页 > 知识库问答 >
问题:

使特定JSFbean会话无效[重复]

督弘化
2023-03-14

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

我有这个示例代码。我使用外部上下文进行测试。失效会话();但它会销毁应用程序中会话中的所有bean,因为它会销毁整个会话。

@Named
@SessionScoped
class Managed implements Serializable {

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

}

但是,使用invalidateSession,会话中的所有bean都将被销毁,我只想使一个特定的“托管”bean失效,我如何做到这一点?

共有2个答案

狄雅珺
2023-03-14

虽然使用BeanManager的方法是可行的,但我建议略有不同的方法。

您应该能够@将HttpSession注入到托管的@SessionScopedbean中,然后在该会话上调用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();
华善
2023-03-14

忽略这样一个事实,即您不清楚如何实现此解决方案

>

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

    @Inject
    BeanManager beanManager;
    

    bean管理器是一个组件,它将允许您访问上下文中的所有cdibean(以及其他内容)。

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

  •  类似资料:
    • 我在spring Boot1.2.3 web应用程序中使用spring security 4.0.1(也使用Spring-Session1.0.1,但这与本案无关)。 每当登录的用户会话过期时,Spring就会检测到无效的会话,并将用户重定向到“.invalidsessionURL(”/session/error/invalid“)” 然而,我只想被重定向,如果目标链接在私人区域内,也不是公共区域

    • 问题内容: 我正在研究的一个项目使用Spring 2.5和JPA,并将Hibernate用作提供程序。 我的DAO类扩展了JpaDaoSupport,因此我使用getJpaTemplate()方法获取了JpaTemplate。 后端数据库可以通过我的应用程序或第三方应用程序进行更改。 当第三方应用程序更改数据库(主要是配置数据更改)时,我需要为应用程序的用户提供一种使所有JPA会话无效并重新加载新

    • 问题内容: 我在2个不同的服务器中有2个应用程序-Tomcat(基本上是.WAR文件)和jBoss中的EAR。 EAR是可重用的应用程序,在这里我将对用户进行身份验证并将控件发送回Tomcat上的应用程序。进行身份验证时,我正在jBoss应用程序上创建一个会话对象。 当我将控件发送回Tomcat上的应用程序时,我将询问用户是否要注销身份验证应用程序。如果用户按下“是”按钮,我将不得不从身份验证应用

    • 问题内容: 我继承了一个非常古老的JSP应用程序(JDK 1.3.1_15),并试图插入会话固定漏洞。 在使用身份验证后,我成功使当前会话无效,但是在创建新会话时,将重新使用旧会话ID。 我可以在HTTP监视器中看到新的会话分配,只是再次使用了相同的数字。 在我之前,根本没有第二个响应头。 有人对如何生成新的会话ID有任何建议吗?我对JRUN4不太熟悉,但是在配置文档中拖拉并没有发现任何东西。 问

    • 问题内容: 如何在Flask中创建一个新的干净会话并使当前会话无效? 我使用还是? 问题答案: 我使用这种方法尽可能解决了这个问题*: 覆盖,从覆盖版本复制代码,而不是调用它。 当覆盖版本的,使其在分钟后传递一个参数。这会导致超过30分钟的Cookie无效。 经常使更新的覆盖版本成为会话变量,以确保cookie及其时间得到定期重写。(我将这个会话变量命名为并在其中存储当前时间,然后仅在自上次存储的

    • 因此,我尝试使用JSF托管bean上的方法访问HttpSession的属性 但是我得到了一个 为什么啊? 在我的一个会话bean被销毁之前,我需要访问该会话打开的外部服务的连接列表,它们当然存储在会话属性对象上。 我该怎么做?