Javascript 如何在浏览器窗口关闭时终止应用程序会话?

Javascript 如何在浏览器窗口关闭时终止应用程序会话?,javascript,session,Javascript,Session,我有个问题 我正在开发一个聊天应用程序。如果用户在未注销的情况下关闭浏览器窗口,我想终止会话。我使用了“beforeunload”函数,但它也会在触发回发事件时触发,所以这对我不好 如果有人对此有任何想法,请提供帮助。如果您使用轮询获取聊天数据,如果在给定时间内未收到客户端的轮询请求,则应终止会话 客户: setInterval (pollData, 10000); /* poll for new data each 10 seconds */ 服务器: if (clientX.LastPol

我有个问题

我正在开发一个聊天应用程序。如果用户在未注销的情况下关闭浏览器窗口,我想终止会话。我使用了“beforeunload”函数,但它也会在触发回发事件时触发,所以这对我不好


如果有人对此有任何想法,请提供帮助。

如果您使用轮询获取聊天数据,如果在给定时间内未收到客户端的轮询请求,则应终止会话

客户:

setInterval (pollData, 10000); /* poll for new data each 10 seconds */
服务器:

if (clientX.LastPollTime is over 30 seconds ago) {
    clientX.killSession();
}

如果使用轮询来获取聊天数据,那么如果在给定时间内没有从客户端收到轮询请求,则应该终止会话

客户:

setInterval (pollData, 10000); /* poll for new data each 10 seconds */
服务器:

if (clientX.LastPollTime is over 30 seconds ago) {
    clientX.killSession();
}

我建议您使用Alexanders方法,但在大多数情况下,设置间隔时间并不能单独解决这个问题。因为用户可能空闲一段时间,并且可能超过超时时间

为了避免这种情况,您需要在此基础上再添加一个条件

  • 如果用户在超时期间空闲,则只需向服务器发出AJAX请求,并将客户端状态更新为空闲。

  • 如果用户在某一时间处于idel状态,这将避免注销会话

  • 如果服务器在指定时间内未收到客户端的任何响应,并且状态未更新为空闲状态(在浏览器关闭或任何应用程序挂起期间),则可以终止会话


我建议您使用Alexanders方法,但在大多数情况下,设置间隔时间并不能单独解决此问题。因为用户可能空闲一段时间,并且可能超过超时时间

为了避免这种情况,您需要在此基础上再添加一个条件

  • 如果用户在超时期间空闲,则只需向服务器发出AJAX请求,并将客户端状态更新为空闲。

  • 如果用户在某一时间处于idel状态,这将避免注销会话

  • 如果服务器在指定时间内未收到客户端的任何响应,并且状态未更新为空闲状态(在浏览器关闭或任何应用程序挂起期间),则可以终止会话


是的,亲爱的,没问题,但在第二件事中,正如您指定的,服务器没有收到任何响应,在我的代码中,服务器只检查应用程序会话,它会找到它,这样它就可以工作了。我想要的是,如果用户没有注销,那么页面将被终止,在这之后,我们如何从客户端调用任何ajax或xmlhttp请求来将应用程序会话设置为脱机


所以请大家告诉我,这是唯一一件不顺利的事情。谢谢您的回复。

是的,亲爱的,没问题,但在第二件事中,您指定服务器没有收到任何响应,在我的代码中,服务器只检查应用程序会话,它会找到它,这样它就可以工作了。我想要的是,如果用户没有注销,那么页面将被终止,在这之后,我们如何从客户端调用任何ajax或xmlhttp请求来将应用程序会话设置为脱机


所以请大家告诉我,这是唯一一件不顺利的事情。感谢您的回复。

正如您所说,当用户单击链接或刷新页面时,event window.onbeforeunload会触发,因此即使结束会话也不太好

但是,您可以在页面上放置一个JavaScript全局变量来标识不应触发注销的操作(例如,通过使用onbeforeonload的AJAX调用)

下面的脚本依赖于JQuery

/*
* autoLogoff.js
*
* Every valid navigation (form submit, click on links) should
* set this variable to true.
*
* If it is left to false the page will try to invalidate the
* session via an AJAX call
*/
var validNavigation = false;

/*
* Invokes the servlet /endSession to invalidate the session.
* No HTML output is returned
*/
function endSession() {
   $.get("<whatever url will end your session>");
}

function wireUpEvents() {

  /*
  * For a list of events that triggers onbeforeunload on IE
  * check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
  */
  window.onbeforeunload = function() {
      if (!validNavigation) {
         endSession();
      }
  }

  // Attach the event click for all links in the page
  $("a").bind("click", function() {
     validNavigation = true;
  });

  // Attach the event submit for all forms in the page
  $("form").bind("submit", function() {
     validNavigation = true;
  });

}

// Wire up the events as soon as the DOM tree is ready
$(document).ready(function() {
    wireUpEvents();  
});
全局变量是在页面级别定义的。如果此变量未设置为true,则事件windows.onbeforeonload将终止会话

事件处理程序附加到页面中的每个链接和表单,以将此变量设置为true,从而防止在用户仅提交表单或单击链接时终止会话

function endSession() {
   $.get("<whatever url will end your session>");
}
函数endSession(){
$.get(“”);
}
如果用户关闭浏览器/选项卡或导航离开,会话将终止。在本例中,全局变量未设置为true,脚本将对要结束会话的URL执行AJAX调用

此解决方案与服务器端技术无关。它没有经过严格的测试,但在我的测试中,它似乎工作得很好


附:我已经在网上发布了这个答案。我不确定我是否应该回答多个类似的问题或发布一个参考?

正如您所说,当用户单击链接或刷新页面时,event window.onbeforeunload会触发,因此即使结束会话也不是一个好方法

但是,您可以在页面上放置一个JavaScript全局变量来标识不应触发注销的操作(例如,通过使用onbeforeonload的AJAX调用)

下面的脚本依赖于JQuery

/*
* autoLogoff.js
*
* Every valid navigation (form submit, click on links) should
* set this variable to true.
*
* If it is left to false the page will try to invalidate the
* session via an AJAX call
*/
var validNavigation = false;

/*
* Invokes the servlet /endSession to invalidate the session.
* No HTML output is returned
*/
function endSession() {
   $.get("<whatever url will end your session>");
}

function wireUpEvents() {

  /*
  * For a list of events that triggers onbeforeunload on IE
  * check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
  */
  window.onbeforeunload = function() {
      if (!validNavigation) {
         endSession();
      }
  }

  // Attach the event click for all links in the page
  $("a").bind("click", function() {
     validNavigation = true;
  });

  // Attach the event submit for all forms in the page
  $("form").bind("submit", function() {
     validNavigation = true;
  });

}

// Wire up the events as soon as the DOM tree is ready
$(document).ready(function() {
    wireUpEvents();  
});
全局变量是在页面级别定义的。如果此变量未设置为true,则事件windows.onbeforeonload将终止会话

事件处理程序附加到页面中的每个链接和表单,以将此变量设置为true,从而防止在用户仅提交表单或单击链接时终止会话

function endSession() {
   $.get("<whatever url will end your session>");
}
函数endSession(){
$.get(“”);
}
如果用户关闭浏览器/选项卡或导航离开,会话将终止。在本例中,全局变量未设置为true,脚本将对要结束会话的URL执行AJAX调用

此解决方案与服务器端技术无关。它没有经过严格的测试,但在我的测试中,它似乎工作得很好


附:我已经在网上发布了这个答案。我不确定我是否应该回答多个类似的问题或发布参考?

如果您可以控制sessionID cookie,只需将其生存期设置为0,这将使会话在浏览器上关闭。打开窗口上会话的生存期可以是cont