6 Stimmen

JSP Automatische Weiterleitung nach Ablauf/Timeout der Sitzung

Gibt es eine Möglichkeit, eine Sitzungszeitüberschreitung ohne Benutzerinteraktion zu erkennen* und sie auf eine bestimmte Seite umzuleiten; d.h. wenn auf der Seite für eine bestimmte Dauer keine Aktivität stattfindet, erkennt der Server dies und leitet automatisch auf eine andere Seite um.

Mit Benutzerinteraktion meine ich; es gibt eine Möglichkeit, eine Sitzungszeitüberschreitung zu erkennen, wenn der Benutzer auf etwas klickt, dann eine Anfrage an den Server gesendet wird und dann der Server überprüft, ob die aktuelle Benutzersitzung abgelaufen ist oder nicht.

Was ich hier brauche, ist, dass wir dem Server nichts mitteilen (oder keine Aktion durchführen), aber wenn die Sitzung abläuft, erkennt der Server dies automatisch und führt die erforderliche Aktion durch.

Danke, Raza

8voto

Jimmy Leo Punkte 81

Wenn die Anforderung nur darin besteht, nach Ablauf der Sitzung zur Anmeldeseite (oder einer anderen Seite) umzuleiten, ist dies meine Implementierung:

Fügen Sie dem folgenden Skript zu ALLEN Seiten, die eine Anmeldung erfordern, hinzu

<%
int timeout = session.getMaxInactiveInterval();
response.setHeader("Refresh", timeout + "; URL = login.jsp");
%>

Auf diese Weise wird jede Seite, die eine Anmeldung erfordert, nach Ablauf der Sitzung aktualisiert/umgeleitet auf login.jsp (ändern Sie es auf Ihre gewünschte URL)

ODER (um das Fehlen von Seiten zu vermeiden)

Sie können es tatsächlich in einer separaten Datei (timedoutRedirect.jsp) schreiben und es als Kopfzeile zu allen Seiten, die eine Anmeldung erfordern, unter Verwendung von "JSP-Elementgruppe" (in der web.xml) einbeziehen

        alle jsp
        /users/*
        /timedoutRedirect.jsp           

(Sie müssen möglicherweise die Vorab-URL an Ihre Projektspezifikationen anpassen)

3voto

Sean Patrick Floyd Punkte 283617

Sie können dies natürlich in JavaScript tun, indem Sie einen dokumentweiten Tastatur- und/oder Maus-Listener implementieren und eine periodische Methode mit einem Timeout verwenden.

var timeOut = 1000 * 60 * 30; // 30 Minuten
var lastActivity = new Date().getTime();
var checkTimeout;
checkTimeOut = function(){
    if(new Date().getTime() > lastActivity + timeOut){
        // Weiterleitung zur Timeout-Seite
    }else{
        window.setTimeout(checkTimeOut, 1000); // Alle Sekunde überprüfen
    }
}

Jetzt müssen Ihre globalen Listener lediglich lastActivity auf die aktuelle Zeit bei jeder Aktion setzen.

Beim erneuten Lesen der Frage möchten Sie offensichtlich die tatsächliche Session-Timeout-Zeit vom Anwendungsserver verwenden. Das ist schwierig, da wenn Sie Ajax-Anforderungen an den Server senden, die Sitzung tatsächlich nicht abläuft (es sei denn, es gibt ein hartes Limit), daher könnte meine Antwort immer noch der beste Weg sein, es zu tun.

0 Stimmen

Ich habe eine Methode wie diese in der Vergangenheit verwendet und sie funktioniert gut. +1

0 Stimmen

Vielen Dank, das habe ich wirklich gebraucht. Übrigens habe ich auch einen verwandten Link auf derselben Website gefunden stackoverflow.com/questions/1985250/…

0voto

malificent Punkte 1431

Ich hatte ein ähnliches Problem, also hier ist, wie ich es gelöst habe...

Grundsätzlich habe ich einen Sitzungstimer auf der Clientseite mit Javascript erstellt. Ich sende periodisch einen Ajax-Aufruf (nach einem Zeitplan, der kürzer ist als die tatsächliche Server-Timeout-Einstellung), um die Sitzung auf dem Server am Leben zu erhalten.

Dann habe ich einen weiteren Timer auf der Clientseite erstellt, der auf die gleiche Zeit wie die tatsächliche Server-Timeout-Einstellung herunterzählt. Wenn dieser Timer abläuft, wird ein Ajax-Aufruf an den Server gemacht, der session.invalidate() ausführt und dann zur Anmeldeseite weiterleitet. Dieser Timer wird jedes Mal zurückgesetzt, wenn es eine Aktion gibt, die die Sitzung am Leben erhalten sollte (z.B. Mausklick, Tastenanschlag usw.).

0voto

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

  • AJAX und

  • Formularübermittlung/Seitenneuladen

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");
  1. Setzen des Meta Auffrischungs-Tags in HTML (Funktioniert nicht für AJAX-Aufrufe)

  2. 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X