Musiałem automatycznie wylogować użytkownika po zamknięciu przeglądarki lub karty, ale nie wtedy, gdy użytkownik przejdzie do innych łączy. Nie chciałem też, aby pojawił się monit o potwierdzenie. Po dłuższej walce z tym, szczególnie w IE i Edge, oto co skończyłem (sprawdziłem pracę z IE 11, Edge, Chrome i Firefox) po tym, jak oparłem podejście na tej odpowiedzi .
Najpierw uruchom licznik czasu na serwerze w beforeunloadmodule obsługi zdarzeń w JS. Wywołania ajax muszą być synchroniczne, aby IE i Edge działały poprawnie. Musisz także użyć, return;aby zapobiec wyświetlaniu okna dialogowego potwierdzenia w następujący sposób:
window.addEventListener("beforeunload", function (e) {
$.ajax({
type: "POST",
url: startTimerUrl,
async: false
});
return;
});
Uruchomienie timera ustawia cancelLogoutflagę na false . Jeśli użytkownik odświeży stronę lub przejdzie do innego łącza wewnętrznego, cancelLogoutflaga na serwerze zostanie ustawiona na wartość true . Po upływie zdarzenia licznika czasu sprawdza cancelLogoutflagę, aby sprawdzić, czy zdarzenie wylogowania zostało anulowane. Jeśli stoper został anulowany, wówczas stoper zostałby zatrzymany. Jeśli przeglądarka lub karta cancelLogoutzostaną zamknięte, flaga pozostanie fałszywa, a moduł obsługi zdarzeń wyloguje użytkownika.
Uwaga dotycząca implementacji: używam ASP.NET MVC 5 i anuluję wylogowanie w przesłoniętej Controller.OnActionExecuted()metodzie.