wake-up-neo.com

SessionTimeout: web.xml vs session.maxInactiveInterval ()

Ich versuche eine HttpSession in Java zu unterbrechen. Mein Container ist WebLogic.

Derzeit haben wir unser Sitzungszeitlimit in der Datei web.xml wie folgt festgelegt

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

Jetzt wird mir gesagt, dass dies die Sitzung (oder sind es alle Sitzungen?) In der 15. Nutzungsminute beendet, unabhängig von ihrer Aktivität.

Ich frage mich, ob dieser Ansatz der richtige ist oder ob ich das Zeitlimit für Inaktivität programmatisch durch setzen soll

session.setMaxInactiveInterval(15 * 60); //15 minutes

Ich möchte nicht alle Sitzungen nach 15 Minuten beenden, sondern nur diejenigen, die seit 15 Minuten inaktiv sind.

Sind diese Methoden gleichwertig? Soll ich die web.xml config bevorzugen?

58
Tom

Jetzt wird mir gesagt, dass dies die Sitzung (oder sind es alle Sitzungen?) In der 15. Minute der Benutzung beendet , ungeachtet ihrer Aktivität .

Dies ist falsch . Die Sitzung wird nur beendet, wenn der zugeordnete Client (Webbrowser) länger als 15 Minuten nicht auf die Website zugegriffen hat. Die Aktivität zählt genau so, wie Sie es ursprünglich erwartet hatten, wenn Sie versuchen, dies zu lösen.

Das HttpSession#setMaxInactiveInterval() ändert sich hier übrigens nicht viel. Es funktioniert genauso wie <session-timeout> In web.xml, Mit dem einzigen Unterschied, dass Sie es während der Laufzeit programmgesteuert ändern/einstellen können. Die Änderung wirkt sich übrigens nur auf die aktuelle Sitzungsinstanz aus, nicht global (ansonsten wäre es eine static -Methode gewesen).


Um herumzuspielen und dies selbst zu erleben, versuchen Sie, <session-timeout> Auf 1 Minute zu setzen und ein HttpSessionListener wie folgt zu erstellen :

@WebListener
public class HttpSessionChecker implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent event) {
        System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
    }

}

(wenn Sie noch nicht mit Servlet 3.0 arbeiten und daher @WebListener nicht verwenden können, registrieren Sie sich wie folgt in web.xml) :

<listener>
    <listener-class>com.example.HttpSessionChecker</listener-class>
</listener>

Beachten Sie, dass der Servletcontainer Sitzungen nach genau dem Zeitlimitwert nicht sofort zerstört. Es handelt sich um einen Hintergrundjob, der in bestimmten Intervallen ausgeführt wird (z. B. 5 bis 15 Minuten, abhängig von der Last und der Marke/dem Typ des Servletcontainers). Seien Sie also nicht überrascht, wenn Sie die Zeile destroyed nicht sofort nach genau einer Minute Inaktivität in der Konsole sehen. Wenn Sie jedoch eine HTTP-Anforderung in einer Sitzung mit Zeitüberschreitung auslösen, die jedoch noch nicht zerstört wurde, wird sie sofort zerstört.

Siehe auch:

117
BalusC

Jetzt wird mir gesagt, dass dies die Sitzung (oder sind es alle Sitzungen?) In der 15. Minute der Nutzung beendet, unabhängig von deren Aktivität.

Nein, das ist nicht wahr. Das session-timeout konfiguriert ein Zeitlimit pro Sitzung im Falle von Inaktivität.

Sind diese Methoden gleichwertig? Soll ich die web.xml-Konfiguration bevorzugen?

Die Einstellung in der Datei web.xml ist global und gilt für alle Sitzungen eines bestimmten Kontexts. Programmatisch können Sie dies für eine bestimmte Sitzung ändern.

12
Pascal Thivent