浏览器 window 关闭后会话未过期- Javascript

Session not expiring after browser window close- Javascript

<script>
  function ServerPing(){       
  var url = "http://localhost:8080/index.html";
  if (window.XMLHttpRequest){ 
    reqXML = new XMLHttpRequest();           
    reqXML.onreadystatechange = HandlePing;   
    reqXML.open("GET", url, true);         
    reqXML.send(null);                        
  }
  else if(window.ActiveXObject){ 
    reqXML = new ActiveXObject("Microsoft.XMLHTTP"); 
    if(reqXML){ 
      reqXML.onreadystatechange = HandlePing;   
      reqXML.open("GET", url, true);         
      reqXML.send(null);                     
    }
  }
  else{  
     window.location.href = url;
  }       
}
     
function HandlePing(){
  window.status = "Pinging Server - state: " + reqXML.readyState;
  if(reqXML.readyState == 4){
    var strDate = new Date().toString();
    if(reqXML.status == 200){
      window.status = "Sucessfull Ping at " + strDate;
    }
    else{
      window.status = "Failed Ping at " + strDate;
    }
  }
}
 
window.onload = function(){
  var timer = setInterval("ServerPing()",10000)
}
  
  </script>
<HTML>
<HEAD> 
<TITLE> Test</TITLE>
 
  <script>
  function ServerPing(){       
  var url = "http://localhost:8383/fcpbweb/index.html";
  if (window.XMLHttpRequest){ 
    reqXML = new XMLHttpRequest();           
    reqXML.onreadystatechange = HandlePing;   
    reqXML.open("GET", url, true);         
    reqXML.send(null);                        
  }
  else if(window.ActiveXObject){ 
    reqXML = new ActiveXObject("Microsoft.XMLHTTP"); 
    if(reqXML){ 
      reqXML.onreadystatechange = HandlePing;   
      reqXML.open("GET", url, true);         
      reqXML.send(null);                     
    }
  }
  else{  
     window.location.href = url;
  }       
}
     
function HandlePing(){
  window.status = "Pinging Server - state: " + reqXML.readyState;
  if(reqXML.readyState == 4){
    var strDate = new Date().toString();
    if(reqXML.status == 200){
      window.status = "Sucessfull Ping at " + strDate;
    }
    else{
      window.status = "Failed Ping at " + strDate;
    }
  }
}
 
window.onload = function(){
  var timer = setInterval("ServerPing()",10000)
}
  
  </script>
</HEAD>


<BODY>

  <div style="height:300px; width:400px; overflow:hidden; border:1px solid red;">
  
  
  <p style="margin:117px auto 0 auto; width:150px">TEST CONTENT</p>
  
  </div>


</BODY>
</HTML>

当我关闭浏览器选项卡时,我的会话在 IE8 中没有过期,chrome & firefox.It 在 IE9 中工作正常。我的主要是 JSP.

HTML:

<body onbeforeunload="HandleOnClose()"></body>

JS代码:

function HandleOnClose(){

    if (event.clientY < 0) {
                        //event.returnValue = 'Want to leave the page?';
                      location.href=location.protocol+"//"+location.host+"${ctx}/"+logoutLocation;
                    }
                }

我在下面也提到了 link 但没有用。

window.onunload is not working properly in Chrome browser. Can any one help me?

我也在使用 Prototypejs 框架。我也对其他解决方案持开放态度。

提前致谢。

您无法在用户关闭标签页时可靠地通知服务器。根本没有 API 。您的示例代码存在几个问题,尤其是试图强制用户进入 onbeforeunload 处理程序中的新位置是低级网站使用的众所周知的策略,因此好的浏览器会忽略它。事实上,即使是刷新操作(而不是关闭选项卡)也会触发您的处理程序。

如果您需要在用户离开您的页面时主动终止会话,唯一可靠的方法是让您的页面在活动时定期对服务器执行 ping 操作,然后让服务器在未激活时终止会话在 X 分钟内看到 ping。请注意,当一个选项卡打开但在后台时,许多浏览器会限制该选项卡的计时器触发的程度,因此您需要尝试使用您的目标浏览器来为您的服务器端超时找到合适的时间间隔。

最后,我用 AJAX/XMLHttpRequest 从下面做了同样的事情 link:

How to end user session when browser closed