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 beforeunload
module 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 cancelLogout
flagę na false . Jeśli użytkownik odświeży stronę lub przejdzie do innego łącza wewnętrznego, cancelLogout
flaga na serwerze zostanie ustawiona na wartość true . Po upływie zdarzenia licznika czasu sprawdza cancelLogout
flagę, 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 cancelLogout
zostaną 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.