Закройтесь/уничтожьте сессию, когда браузер или вкладка будут закрыты

Кто-то может сказать мне, как я могу закрыться/уничтожить сессию, когда пользователь закрывает браузер? Я использую stateserver режим для своего веб-приложения asp.net. onbeforeunload метод не правилен, поскольку он стреляет, когда пользователь обновляет страницу.

31
задан sth 1 June 2010 в 11:08
поделиться

3 ответа

Вы можете т. HTTP - это протокол без сохранения состояния, поэтому вы не можете сказать, когда пользователь закрыл свой браузер или он просто сидит там с открытым окном браузера и ничего не делает.

Вот почему у сеансов есть тайм-аут - вы можете попробовать уменьшить таймаут для более быстрого закрытия неактивных сеансов, но это может привести к преждевременному истечению тайм-аута сеанса законных пользователей.

29
ответ дан 27 November 2019 в 22:15
поделиться

Как уже говорилось, браузер не сообщает серверу, когда он закрывается.

Тем не менее, есть несколько способов добиться такого поведения. Вы можете поместить небольшой скрипт AJAX, который регулярно обновляет сервер при открытом браузере. Вы должны соединить это с чем-то, что запускается при действиях, сделанных пользователем, чтобы вы могли истечь время ожидания для сеанса ожидания, а также для сеанса, который завершился.

7
ответ дан 27 November 2019 в 22:15
поделиться

Как вы сказали, событие window.onbeforeunload срабатывает, когда пользователи нажимают на ссылку или обновляют страницу, поэтому было бы не очень хорошо даже закончить сеанс.

http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx описывает все ситуации, в которых происходит срабатывание window.onbeforeunload. (IE)

Однако, вы можете поместить глобальную переменную JavaScript на ваши страницы, чтобы определить действия, которые не должны вызывать логотип (например, с помощью AJAX-вызова из onbeforeonload).

Скрипт, приведенный ниже, опирается на 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 и скрипт выполнит вызов AJAX на любой URL, по которому вы хотите завершить сеанс

Это решение является агностичным с точки зрения серверной технологии. Оно не было подвергнуто экзаузационному тестированию, но, похоже, отлично работает в моих тестах

.
6
ответ дан 27 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: