当前位置:  开发笔记 > 编程语言 > 正文

Java:关闭选项卡或浏览器时为什么不会销毁http会话?

如何解决《Java:关闭选项卡或浏览器时为什么不会销毁http会话?》经验,为你挑选了2个好方法。

我有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

}

}

基本上我记录会话创建和销毁时间.但是如果会话很长(默认为30分钟),并且用户同时关闭浏览器,那么

sessionDestroyed 

不叫?

这是为什么 ?是否有解决方法来准确记录会话被销毁的时间(当用户关闭浏览器时)?难道这不应该是浏览器的问题,在关闭时杀死会话吗?

我必须实现任何接口才能实现此功能吗?

谢谢 !



1> Jon Skeet..:

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

这是HTTP的基本部分 - 它是一个请求/响应协议,而不是"永久开放的对话",您可以在其中判断一方是否离开了对话.把它想象成一系列电报而不是电话 - 当你收到最后一封电报时,你无法分辨.

您需要设计自己的方式 - 以避免需要知道浏览器何时关闭.有一些丑陋的黑客可以解决它 - 例如,让AJAX用心跳信息轮询服务器 - 但改变设计是一个更好的解决方案.


@dom:不,我已经解释了为什么这是不可能可靠的,除了丑陋的黑客攻击,如心跳轮询服务器以保持会话活着.

2> ramayac..:

注意:正如jwenting在下面评论的那样,它根本不是100%安全的.如果onunload事件没有被浏览器选项卡或窗口的关闭事件触发,那么这将失败.

我有同样的问题,并使用侵入式JavaScript事件解决它:

window.onunload

让我简单解释一下,假设您有一个JavaScript函数,使用jQuery将当前的Session ID发布到该Servlet以使其无效,如下所示:

function safeexit(){
   $.post("/SessionKillServlet", { SID = <%=session.getId()%> }, function(data){});
}

要调用该函数,您只需要像这样绑定它:

window.onunload =  safeexit;  //without the ()

现在,当TAB或BROWSER WINDOW关闭(或重定向)时,将调用safeexit方法.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有