Может кто-нибудь сказать мне, как закрыть/убить сеанс, когда пользователь закрывает браузер? Я использую режим stateerver для моего веб-приложения asp.net. Метод onbeforeunload
не подходит, когда он запускается, когда пользователь обновляет страницу.
Закрытие/завершение сеанса при закрытии браузера или вкладки
Ответ 1
Вы не можете. HTTP - это протокол без учета состояния, поэтому вы не можете сказать, когда пользователь закрыл свой браузер, или просто сидят там, открыв окно браузера, ничего не делая.
Итак, почему сеансы имеют тайм-аут - вы можете попытаться уменьшить таймаут, чтобы быстрее закрыть неактивные сессии, но это может привести к тому, что у законных пользователей раннее время ожидания сеанса.
Ответ 2
Как сказано, браузер не сообщает серверу, когда он закрывается.
Тем не менее, есть некоторые способы достичь близкого к этому поведению. Вы можете разместить небольшой AJAX script, который регулярно обновляет сервер, открывая браузер. Вы должны соединить это с чем-то, что срабатывает над действиями, сделанными пользователем, поэтому вы можете отключить как незанятый сеанс, так и закрывшийся.
Ответ 3
Как вы сказали, событие window.onbeforeunload срабатывает, когда пользователи нажимают на ссылку или обновляют страницу, поэтому было бы неплохо даже закончить сеанс.
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx описывает все ситуации, когда запускается window.onbeforeonload. (IE)
Однако вы можете разместить глобальную переменную JavaScript на своих страницах, чтобы определить действия, которые не должны вызывать выход из системы (например, с помощью вызова AJAX из onbeforeonload).
Ниже приведено script на 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 может быть включен во все страницы
<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, событие window.onbeforeonload завершит сеанс.
Обработчик событий привязан к каждой ссылке и форме на странице, чтобы установить эту переменную в true, таким образом предотвращая завершение сеанса, если пользователь просто отправляет форму или нажимает на ссылку.
function endSession() {
$.get("<whatever url will end your session>");
}
Сессия прекращается, если пользователь закрыл браузер/вкладку или переместился. В этом случае глобальная переменная не была установлена в true, а script выполнит вызов AJAX в зависимости от того, какой URL-адрес вы хотите завершить сеансом
Это решение является агностиком на стороне сервера. Это не было exaustively испытано но оно кажется, что работает отлично в моих испытаниях
Ответ 4
Я делаю это так:
$(window).bind('unload', function () {
if(event.clientY < 0) {
alert('Thank you for using this app.');
endSession(); // here you can do what you want ...
}
});
window.onbeforeunload = function () {
$(window).unbind('unload');
//If a string is returned, you automatically ask the
//user if he wants to logout or not...
//return ''; //'beforeunload event';
if (event.clientY < 0) {
alert('Thank you for using this service.');
endSession();
}
}
Ответ 5
Для закрытия браузера вы можете ввести код ниже в свой web.config:
<system.web>
<sessionState mode="InProc"></sessionState>
</system.web>
Он уничтожит ваш сеанс, когда браузер будет закрыт, но он не будет работать для закрытия вкладки.
Ответ 6
Не идеальное, но лучшее решение на данный момент:
var spcKey = false;
var hover = true;
var contextMenu = false;
function spc(e) {
return ((e.altKey || e.ctrlKey || e.keyCode == 91 || e.keyCode==87) && e.keyCode!=82 && e.keyCode!=116);
}
$(document).hover(function () {
hover = true;
contextMenu = false;
spcKey = false;
}, function () {
hover = false;
}).keydown(function (e) {
if (spc(e) == false) {
hover = true;
spcKey = false;
}
else {
spcKey = true;
}
}).keyup(function (e) {
if (spc(e)) {
spcKey = false;
}
}).contextmenu(function (e) {
contextMenu = true;
}).click(function () {
hover = true;
contextMenu = false;
});
window.addEventListener('focus', function () {
spcKey = false;
});
window.addEventListener('blur', function () {
hover = false;
});
window.onbeforeunload = function (e) {
if ((hover == false || spcKey == true) && contextMenu==false) {
window.setTimeout(goToLoginPage, 100);
$.ajax({
url: "/Account/Logoff",
type: 'post',
data: $("#logoutForm").serialize(),
});
return "Oturumunuz kapatıldı.";
}
return;
};
function goToLoginPage() {
hover = true;
spcKey = false;
contextMenu = false;
location.href = "/Account/Login";
}
Ответ 7
Невозможно убить переменную сеанса, когда машина не отслеживает завершение работы из-за сбоя питания. Это возможно только в том случае, если пользователь простаивает в течение длительного времени или правильно выходит из системы.
Ответ 8
Пожалуйста, ознакомьтесь со следующими шагами:
- Сначала создайте страницу SessionClear.aspx и напишите код для очистки сеанса
-
Затем добавьте следующий код JavaScript на свою страницу или главную страницу:
<script language="javascript" type="text/javascript"> var isClose = false; //this code will handle the F5 or Ctrl+F5 key //need to handle more cases like ctrl+R whose codes are not listed here document.onkeydown = checkKeycode function checkKeycode(e) { var keycode; if (window.event) keycode = window.event.keyCode; else if (e) keycode = e.which; if(keycode == 116) { isClose = true; } } function somefunction() { isClose = true; } //<![CDATA[ function bodyUnload() { if(!isClose) { var request = GetRequest(); request.open("GET", "SessionClear.aspx", true); request.send(); } } function GetRequest() { var request = null; if (window.XMLHttpRequest) { //incase of IE7,FF, Opera and Safari browser request = new XMLHttpRequest(); } else { //for old browser like IE 6.x and IE 5.x request = new ActiveXObject('MSXML2.XMLHTTP.3.0'); } return request; } //]]> </script>
-
Добавьте в тег тела главной страницы следующий код.
<body onbeforeunload="bodyUnload();" onmousedown="somefunction()">
Ответ 9
Используйте это:
window.onbeforeunload = function () {
if (!validNavigation) {
endSession();
}
}
Предотвратить F5, отправить форму, ввести клик и закрыть/убить сеанс, когда браузер или вкладка закрыты, проверены в ie8 + и современных браузерах, наслаждайтесь!