Entweder es kann ein einfacher Servlet, Spring-MVC oder Spring-Security sein, Auto-Logout ist nicht möglich ohne eine perfekte clientseitige Logik.
Berücksichtigung, dass die Anwendung beide Arten von Anfragen haben wird
Auto-Logout benötigt sehr durchdachte Logik. Hier ist meine Implementierung der Auto-Logout-Funktionalität mit folgenden
Vorteilen.
1. Es wird kein zusätzlicher Aufruf/Request verwendet, um dies zu erreichen. Berücksichtigen der Leistungseinfluss, wenn mehr als 10k aktive Benutzer sind und zusätzliche Aufrufe erforderlich sind, um Auto-Logout zu erreichen.
2. Eine Zeilenkonfiguration mit Verwendung von tag.
3. Funktioniert einwandfrei, auch wenn der Benutzer mehrere Tabs oder Fenster geöffnet hat.
4. Es informiert Sie 30 Sekunden vor der Sitzungsablauf, sodass Sie, wenn Sie ein Formular ausgefüllt und nicht abgeschickt haben, die Sitzung am Leben halten können (die Sitzung durch einen Klick verlängern). So ist es unwahrscheinlicher, dass der Benutzer ungespeicherte Daten verliert.
Verwendung
1. Binden Sie das Auto-Logout-Skript in erforderliche JSP-Seiten ein, wie unten angegeben.
....
2. Erstellen Sie eine JSP-Seite, autologout-script.jsp und fügen Sie den folgenden Code hinzu. Hinweis: Keine Bearbeitung/Konfiguration erforderlich
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
$(document).ready(function()
{
var timeOutTimeInSeconds = ${ timeOutTimeInSeconds };
var showTimerTimeInSeconds= ${ showTimerTimeInSeconds };
var sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
var timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
var badgeTimerId;
window.localStorage.setItem("AjaxRequestFired", new Date());
function redirectToLoginPage(){
//location.href = '<c:url value="/" />'+'${loginPageUrl}';
window.location.reload();
}
$(document).ajaxComplete(function () {
resetTimer();
});
$(window).bind('storage', function (e) {
if(e.originalEvent.key == "AjaxRequestFired"){
console.log("Anforderung von einem anderen Tab gesendet, daher Timer zurücksetzen")
resetTimer();
}
});
function resetTimer()
{
showTimerTimeInSeconds= ${ showTimerTimeInSeconds };
console.log("timeOutTimeInSeconds : "+timeOutTimeInSeconds)
window.localStorage.setItem("AjaxRequestFired", new Date());
window.clearInterval(sessionCheckIntervalId);
sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
window.clearInterval(timerDisplayIntervalId);
timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
hideTimer();
}
function showTimer()
{
$('#sessionTimeRemaining').show();
$('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
window.clearInterval(timerDisplayIntervalId);
badgeTimerId = setInterval(function(){
$('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
}, 1000);
}
function hideTimer()
{
window.clearInterval(badgeTimerId);
$('#sessionTimeRemaining').hide();
}
});
3. Konfigurieren Sie Sitzungsattribute, um Timeout-Einstellungen zu konfigurieren Hinweis: Konfigurieren Sie dies nach der Sitzungserstellung. Sie können die Implementierung von HttpSessionListener sessionCreated-Methode und die folgende Konfiguration entsprechend Ihren Anforderungen setzen.
session.setMaxInactiveInterval(300);
session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);
4. Fügen Sie den folgenden HTML-Code hinzu, um den Timer anzuzeigen.
Hinweis: Es kann in die Autologout-Skriptvorlage-Seite verschoben werden, wenn Sie gut in CSS sind. Auf diese Weise können Sie es vermeiden, es auf jeder Seite hinzuzufügen.
Binden Sie Bootstrap ein oder fügen Sie Ihr benutzerdefiniertes CSS hinzu.
30
Aktualisieren
![Bildbeschreibung hier eingeben]()
Das ist alles über eine einfache Auto-Logout-Implementierung. Sie können ein funktionierendes Beispiel aus meinem GitHub-Repository herunterladen
Auto-Logout mit einfacher Servlet-Beispiel
Auto-Logout mit Spring-Security Java-Konfigurationsbeispiel
Auto-Logout mit Spring-Security XML-Konfigurationsbeispiel
Erklärung der Logik
Fall 1: Beim Seitenladen
Hier ist die Logik einfach, beim Laden der Seite wird der Timer des Intervalls auf maxInactiveInterval gesetzt. Nach Ablauf wird zur Login-Seite weitergeleitet.
Fall 2: Verfolgung von AJAX-Aufrufen
Bei AJAX-Anfragen kann man .ajaxStart() oder .ajaxComplete() Rückrufe von jQuery verwenden, damit bei einem AJAX-Aufruf das Intervall zurückgesetzt wird.
Fall 3: Verfolgung von Aktivitäten in mehreren Tabs/Fenstern
Die Kommunikation zwischen den Tabs/Fenstern erfolgt, um den Zustand jedes Tabs zu synchronisieren. Verwendung von localStorage bei onChange-Ereignis.
Einschränkungen/Verbesserungen erforderlich
1. Wenn die maximale erlaubte Sitzung eins ist und eine Sitzung von einem anderen System übernommen wird, wird der AJAX-Aufruf fehlschlagen. Dies muss behandelt werden, um zur Login-Seite umzuleiten.
2. Verwenden Sie ajaxStart() anstelle von ajaxComplete(), um eine genaue Synchronisierung der idleTime-Werte zwischen Server und Browser zu ermöglichen.
Anforderungen
1. Jquery
Alternativen zum aktuellen Implementierungsvergleich
1. Setzen des Auffrischungs-Headers in der HTTP-Antwort. (Funktioniert nicht für AJAX-Aufrufe)
response.setHeader("Refresh", "60; URL=login.jsp");
-
Setzen des Meta Auffrischungs-Tags in HTML (Funktioniert nicht für AJAX-Aufrufe)
-
Konfiguration des Aktivitätsüberwachers Hält die Sitzung am Leben durch wiederholte AJAX-Anfragen. Verfolgt die Leerlaufzeit und sendet nach Ablauf eine Logout-Anforderung.
Ohne Zweifel ist dies eine gute Variante mit einfacher Logik. Aber ich möchte nur meine Beobachtungen niederschreiben.
- Leistungseinfluss wenn pro Minute 2 Anfragen für das Halten der Sitzung und 50k aktiven Benutzern gemacht werden. 100k Anfragen pro Minute.
- Inter-Tab-Kommunikation Wenn zwei Tabs geöffnet sind, empfängt ein Tab Aktivität, aber das andere Tab empfängt keine Aktivität, dann sendet dieses Tab eine Logout-Anforderung und ungültigt die Sitzung, obwohl Aktivität in einem anderen Tab vorhanden ist. (Kann aber behandelt werden)
- Erzwungener Logout-Ansatz Der Kunde dominiert über den Server, um die Sitzung ungültig zu machen.