Javascript 如何在浏览器窗口关闭时终止应用程序会话?
我有个问题 我正在开发一个聊天应用程序。如果用户在未注销的情况下关闭浏览器窗口,我想终止会话。我使用了“beforeunload”函数,但它也会在触发回发事件时触发,所以这对我不好Javascript 如何在浏览器窗口关闭时终止应用程序会话?,javascript,session,Javascript,Session,我有个问题 我正在开发一个聊天应用程序。如果用户在未注销的情况下关闭浏览器窗口,我想终止会话。我使用了“beforeunload”函数,但它也会在触发回发事件时触发,所以这对我不好 如果有人对此有任何想法,请提供帮助。如果您使用轮询获取聊天数据,如果在给定时间内未收到客户端的轮询请求,则应终止会话 客户: setInterval (pollData, 10000); /* poll for new data each 10 seconds */ 服务器: if (clientX.LastPol
如果有人对此有任何想法,请提供帮助。如果您使用轮询获取聊天数据,如果在给定时间内未收到客户端的轮询请求,则应终止会话 客户:
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状态,这将避免注销会话
- 如果服务器在指定时间内未收到客户端的任何响应,并且状态未更新为空闲状态(在浏览器关闭或任何应用程序挂起期间),则可以终止会话
- 如果用户在超时期间空闲,则只需向服务器发出AJAX请求,并将客户端状态更新为空闲。
- 如果用户在某一时间处于idel状态,这将避免注销会话
- 如果服务器在指定时间内未收到客户端的任何响应,并且状态未更新为空闲状态(在浏览器关闭或任何应用程序挂起期间),则可以终止会话
所以请大家告诉我,这是唯一一件不顺利的事情。谢谢您的回复。是的,亲爱的,没问题,但在第二件事中,您指定服务器没有收到任何响应,在我的代码中,服务器只检查应用程序会话,它会找到它,这样它就可以工作了。我想要的是,如果用户没有注销,那么页面将被终止,在这之后,我们如何从客户端调用任何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