如何在jsf中关闭浏览器上的数据库条目?

时间:2013-06-19 07:51:44

标签: spring jsf-2 primefaces

在我们的应用程序中 一旦用户登录,使用JSF / PrimeFaces,Spring和Hibernate,我们在数据库中设置一个标志,直到用户从应用程序注销或会话到期为止。问题是,我们需要在数据库中清除此标志,即使他只是在没有正确注销的情况下关闭浏览器。为了实现这一点,我已经尝试了jquery $window.unload$window.bind函数,这些函数实际上调用了一些与<p:remoteCommand>相关联的JS函数,后者又调用托管bean方法来清除DB。然而,我后来才知道这不可靠,而且在测试的同时我们也看到事件没有持续发射。我怎样才能实现数据库清理?

1 个答案:

答案 0 :(得分:1)

聆听浏览器关闭不可靠。您可以使用beforeunload事件,但是在全世界都知道的每个Web浏览器上都不支持这种情况,甚至最终用户也无法使用它/可欺骗/黑客攻击。那么我们在解释ajax请求时并没有谈论竞争条件:ajax请求是否会在浏览器关闭之前完全到达?通常情况并非如此,浏览器关闭胜过ajax请求。

只需在会话到期时监听服务器端。

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // NOOP.
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        HttpSession session = event.getSession();
        // Do your job here. 
        // ...
    }

}

请注意,在程序化注销期间显式调用ExternalContext#invalidateSession()(或HttpSession#invalidate())时也会调用此方法。