Как вы сказали, событие window.onbeforeunload срабатывает, когда пользователь нажимает на ссылку или обновляет страницу, поэтому было бы нехорошо даже завершить сеанс.
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx описывает все ситуации, когда срабатывает window.onbeforeonload. (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-адреса, который вы хотите завершить в сеансе
Это решение не зависит от серверных технологий. Это не было исчерпывающе проверено, но в моих тестах оно работает нормально