Session 在JSF管理的bean中侦听用户会话何时结束

Session 在JSF管理的bean中侦听用户会话何时结束,session,jsf,listener,managed-bean,Session,Jsf,Listener,Managed Bean,可以这样做吗:当用户会话开始时,我从数据库中读取某个整数属性。当用户在此会话中执行某些活动时,我更新该变量(存储在会话中)&当会话结束时,我最终将该值存储到数据库中 我的问题是,如果用户会话已经结束,我如何使用JSF框架进行标识&然后我应该将值存储回DB 我的问题是如何识别使用 如果用户会话 已结束&然后我应该存储 值返回到DB JSF框架没有单独的会话概念;它使用Servlet规范的底层会话管理特性 您必须创建一个为捕获会话创建和销毁事件提供钩子的数据库,您可以在其中读取值并将其存储回数据库。

可以这样做吗:当用户会话开始时,我从数据库中读取某个整数属性。当用户在此会话中执行某些活动时,我更新该变量(存储在会话中)&当会话结束时,我最终将该值存储到数据库中

我的问题是,如果用户会话已经结束,我如何使用JSF框架进行标识&然后我应该将值存储回DB

我的问题是如何识别使用 如果用户会话 已结束&然后我应该存储 值返回到DB

JSF框架没有单独的会话概念;它使用Servlet规范的底层会话管理特性

您必须创建一个为捕获会话创建和销毁事件提供钩子的数据库,您可以在其中读取值并将其存储回数据库。

除了,您还可以为此使用会话范围的托管bean。您可以使用(或者只是bean的构造函数)和注释来钩住会话的创建和销毁

@ManagedBean
@SessionScoped
public class SessionManager {

    @PostConstruct
    public void sessionInitialized() {
        // ...
    }

    @PreDestroy
    public void sessionDestroyed() {
        // ...
    }

}

唯一的要求是在JSF页面中引用这个bean,或者作为任何请求范围bean的
@ManagedProperty
。否则它不会被创建。但在您的情况下,这应该没有问题,因为您显然已经在使用会话范围内的托管bean,只需添加一个
@PreDestroy
方法就足够了。

HttpSessionListener
,或者如果您需要依赖项注入来进行保存,您可以使用
@PostConstruct&@PreDestroy
。请记住,当您调用
invalidate()
或在会话超时后,而不是当用户关闭浏览器时,会话将被销毁。无论如何,为什么要使用会话范围,会话范围可能更适合您。

我正在尝试第二种方法,因为它看起来不错。另外,我需要能够获得EJB和实体管理器的句柄,这似乎只能从JSF中的托管bean获得(与HttpSessionListener相反)。我使sessionscoped managedbean成为我的登录处理requestscoped bean的managedproperty,这样当用户登录时它就进入范围。我遇到的问题是,我标记为@PreDestroy的方法似乎在登录bean超出范围时(即登录方法返回时)被调用。所以我的代码提前发射了。你知道为什么会这样吗?