有人可以告诉我如何在用户关闭浏览器时关闭/终止会话?我正在为我的asp.net web应用程序使用stateserver模式.该onbeforeunload方法不正确,因为当用户刷新页面时它会触发.
Ode*_*ded 29
你不能.HTTP是一种无状态协议,因此您无法判断用户何时关闭了浏览器,或者他们只是坐在那里打开浏览器窗口什么都不做.
这就是会话超时的原因 - 您可以尝试减少超时以便更快地关闭非活动会话,但这可能会导致合法用户提前超时.
如上所述,浏览器不会让服务器知道何时关闭.
不过,有一些方法可以实现接近这种行为.您可以放置一个小型AJAX脚本,定期更新服务器以确保浏览器处于打开状态.您应该将此配对与用户所做的操作激发的内容配对,这样您就可以将空闲会话以及已关闭的会话超时.
正如您所说,当用户点击链接或刷新页面时,事件window.onbeforeunload会触发,因此即使结束会话也不会有好处.
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx描述了触发window.onbeforeonload的所有情况.(IE)
但是,您可以在页面上放置一个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();
});
Run Code Online (Sandbox Code Playgroud)
此脚本可能包含在所有页面中
<script type="text/javascript" src="js/autoLogoff.js"></script>
Run Code Online (Sandbox Code Playgroud)
我们来看看这段代码:
var validNavigation = false;
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;
});
Run Code Online (Sandbox Code Playgroud)
全局变量在页面级别定义.如果此变量未设置为true,则事件windows.onbeforeonload将终止会话.
事件处理程序附加到页面中的每个链接和表单以将此变量设置为true,从而防止在用户只是提交表单或单击链接时终止会话.
function endSession() {
$.get("<whatever url will end your session>");
}
Run Code Online (Sandbox Code Playgroud)
如果用户关闭浏览器/选项卡或导航,会话将终止.在这种情况下,全局变量未设置为true,并且脚本将对要结束会话的任何URL执行AJAX调用
该解决方案与服务器端技术无关.它没有经过详尽的测试,但在我的测试中它似乎运行良好