我有以下HttpSessionlistener的实现

public class SessionListener implements HttpSessionAttributeListener, HttpSessionListener {


public void attributeAdded(HttpSessionBindingEvent event) {
   ...

}


public void attributeRemoved(HttpSessionBindingEvent event) {

    ...
}

public void attributeReplaced(HttpSessionBindingEvent event) {

}

//HttpSesion creation & destruction
public void sessionCreated(HttpSessionEvent event) {
    HttpSession session = event.getSession();
    //log created time


}

public void sessionDestroyed(HttpSessionEvent event) {
    HttpSession session = event.getSession();
    long destroyedTime = System.currentTimeMillis();
    //log destroyed time

}

}

基本上,我记录 session 的创建和销毁时间。
但是,如果 session 很长(默认为30分钟),并且用户同时关闭浏览器,则
sessionDestroyed

不叫?

这是为什么 ?
是否存在一种解决方法来准确记录 session 被销毁的时间(用户关闭浏览器时)?这不是浏览器的问题,当 session 关闭时终止 session 吗?

我必须实现任何接口(interface)才能正常工作吗?

谢谢 !

最佳答案

服务器如何知道关闭浏览器或关闭标签页的时间?此时,浏览器不会向服务器发送任何内容。

这是HTTP的基本组成部分-它是请求/响应协议(protocol),而不是“永久开放的对话”,您可以在其中确定一方是否离开对话。将其视为一系列电报而不是电话-您无法确定何时收到最后一次收到的电报。

您需要围绕此进行设计-避免需要知道何时关闭浏览器。有一些丑陋的解决方法,例如使AJAX用心跳消息轮询服务器,但是更改设计是更好的解决方案。

10-07 19:05
查看更多