关闭浏览器或选项卡时关闭/终止会话

Pun*_*nit 31 asp.net session

有人可以告诉我如何在用户关闭浏览器时关闭/终止会话?我正在为我的asp.net web应用程序使用stateserver模式.该onbeforeunload方法不正确,因为当用户刷新页面时它会触发.

Ode*_*ded 29

你不能.HTTP是一种无状态协议,因此您无法判断用户何时关闭了浏览器,或者他们只是坐在那里打开浏览器窗口什么都不做.

这就是会话超时的原因 - 您可以尝试减少超时以便更快地关闭非活动会话,但这可能会导致合法用户提前超时.

  • facebook和gmail做到了 - 有谁知道他们是如何实现这一目标的? (16认同)
  • @NexusRex您可以设置在浏览器关闭时过期的会话cookie.这不会使会话服务器端到期,但浏览器将不再拥有该令牌. (11认同)

Pet*_* H. 7

如上所述,浏览器不会让服务器知道何时关闭.

不过,有一些方法可以实现接近这种行为.您可以放置​​一个小型AJAX脚本,定期更新服务器以确保浏览器处于打开状态.您应该将此配对与用户所做的操作激发的内容配对,这样您就可以将空闲会话以及已关闭的会话超时.


Dan*_*elo 6

正如您所说,当用户点击链接或刷新页面时,事件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调用

该解决方案与服务器端技术无关.它没有经过详尽的测试,但在我的测试中它似乎运行良好

  • 重要的是要注意,你必须使它成为*同步*Ajax请求,否则它根本不可能被解雇.当然,同步Ajax请求很难看,它们完全占用了浏览器的UI. (3认同)