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