Spring 如何在jsf中清除浏览器关闭时的数据库条目?

Spring 如何在jsf中清除浏览器关闭时的数据库条目?,spring,jsf-2,primefaces,Spring,Jsf 2,Primefaces,在我们的应用程序中 使用JSF/PrimeFaces、Spring和Hibernate一旦用户登录,我们在DB中设置一个标志,直到用户从应用程序注销或会话过期。问题是,我们需要在DB中清除此标志,即使他只是在没有正确注销的情况下关闭浏览器。为了实现这一点,我已经尝试了jquery$window.unload和$window.bind函数,它们实际上调用了一些与相关联的JS函数,而这些函数又调用了一个托管bean方法来清除数据库。然而,我后来才知道这是不可靠的,在测试过程中,我们也看到事件没有持续

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

在浏览器关闭时监听不可靠。您可以在卸载之前使用
事件,但这并不是世界上所有已知的网络浏览器都支持的,最终用户甚至不支持它。那么,我们不是在讨论启动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()
)时,也会调用此函数。

建议使用基于超时的方法无法检测浏览器是否关闭。这是不可能的。因为这个问题太普遍了,我不得不相信一定有一些解决办法。虽然我还没有尝试这个,但我们可以写一个过滤器,并尝试清除过滤器销毁方法中的标志吗?只是一种预感!!!嗯……我也在想类似的事情。不管怎样,thanx mate会为你提供答案。我会尝试一下,并让你知道结果。问题是sessionDestroyed在浏览器关闭时不会被调用。你对此有何想法?它在会话被破坏时被调用,在浏览器关闭X分钟后发生。这个X默认为30分钟,可以在web.xml.Ok.中配置。你所说的参数是对的?在我们的例子中,我们使用它的值接近10小时。因此,在这种情况下,即使调用sessionDestroyed方法,它也没有用,不是吗?我的理解正确吗?10小时简直是疯了。无论您想用如此大的会话超时来解决什么问题,都应该以不同的方式来解决。