有人可以告诉我如何在用户关闭浏览器时关闭/终止会话?我正在为我的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();  
});
此脚本可能包含在所有页面中
<script type="text/javascript" src="js/autoLogoff.js"></script>
我们来看看这段代码:
  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;
  });
全局变量在页面级别定义.如果此变量未设置为true,则事件windows.onbeforeonload将终止会话.
事件处理程序附加到页面中的每个链接和表单以将此变量设置为true,从而防止在用户只是提交表单或单击链接时终止会话.
function endSession() {
   $.get("<whatever url will end your session>");
}
如果用户关闭浏览器/选项卡或导航,会话将终止.在这种情况下,全局变量未设置为true,并且脚本将对要结束会话的任何URL执行AJAX调用
该解决方案与服务器端技术无关.它没有经过详尽的测试,但在我的测试中它似乎运行良好
| 归档时间: | 
 | 
| 查看次数: | 118540 次 | 
| 最近记录: |