Мне нужно было автоматически выходить из системы при закрытии браузера или вкладки, но не при переходе пользователя по другим ссылкам.Я также не хотел, чтобы в этом случае отображался запрос на подтверждение.Поработав с этим некоторое время, особенно с IE и Edge, вот что я закончил (проверил работу с IE 11, Edge, Chrome и Firefox) после того, как основал подход с помощью этого ответа .
Сначала запустите таймер обратного отсчета на сервере в обработчике событий beforeunload
в JS.Для правильной работы IE и Edge вызовы ajax должны быть синхронными.Вам также необходимо использовать return;
, чтобы диалоговое окно подтверждения не отображалось следующим образом:
window.addEventListener("beforeunload", function (e) {
$.ajax({
type: "POST",
url: startTimerUrl,
async: false
});
return;
});
При запуске таймера для флага cancelLogout
устанавливается значение false .Если пользователь обновляет страницу или переходит на другую внутреннюю ссылку, флаг cancelLogout
на сервере устанавливается на true .По истечении времени таймера он проверяет флаг cancelLogout
, чтобы узнать, отменено ли событие выхода из системы.Если таймер был отменен, то он остановит таймер.Если браузер или вкладка были закрыты, тогда флаг cancelLogout
останется false , и обработчик событий выведет пользователя из системы.
Примечание по реализации: я использую ASP.NET MVC5, и я отменяю выход из системы переопределенным методом Controller.OnActionExecuted()
.