我有以下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用心跳消息轮询服务器,但是更改设计是更好的解决方案。