Verfolgung des Sitzungsablaufs im Browser

Es gibt also diese komplexe heterogene Webanwendung, bei der AJAX-Teile sowohl manuell als auch über Frameworks, mehrere Popup-Fenster usw. erstellt werden. Ein seriöser Client spricht Sie mit der Anforderung an, das gesamte Web ungültig zu machen, zu schließen oder eine andere Aktivität auszuführen Anwendungsfenster nach Ablauf der HTTP-Sitzung. Hoffentlich wissen Sie, wie Sie das Zeitlimit für HTTP-Sitzungen steuern können. Bei einer J2EE-kompatiblen Webanwendung erfolgt dies über eine web.xml-Datei (auf vielen App-Servern erfolgt dies jedoch nicht auf standardmäßige Weise). Für eine Auszeit von 10 Minuten ist es:

  10  

Die Client-Anforderung ist überhaupt nicht absurd und aus Sicht des Endbenutzers durchaus sinnvoll, kann jedoch für Entwickler zu einem schrecklichen Schmerz werden, weil: 1. Sie können nicht jedes Mal, wenn eine Seite geladen wird, einen Countdown-Timer im Browserfenster starten das Fenster nach einer Auszeit zu schließen. Dieser Ansatz funktionierte in einer Nicht-AJAX-Welt, als jede Browser-Server-Interaktion dazu führte, dass das Browserfenster neu geladen wurde. 2. Sie können den Server nicht abfragen, um zu überprüfen, ob das Zeitlimit für die HTTP-Sitzung abgelaufen ist oder nicht, da jede solche Abfrage als Browser-Server-Interaktion behandelt wird, die die Sitzung verlängert. Dies führt zu einer nie ablaufenden Sitzung. 3. Sie können eine separate Webanwendung erstellen, die die HTTP-Sitzung der primären Webanwendung kennt und sich mit dieser überschneidet. Aber das ist ein Overkill,und die Chancen, dass eine solche Lösung akzeptiert wird, sind aufgrund von Integrationsproblemen, die wahrscheinlich auftreten, äußerst gering. 4. Sie könnten versuchen, alle AJAX-Browser-Server-Interaktionen mit fortgeschrittenem hackähnlichem Code abzufangen. Dies hilft Ihnen dabei, mit Ihrem aktuellen Fenster umzugehen. Dies funktioniert jedoch nicht für den Fall mit mehreren geöffneten Fenstern. Sie können einfach nicht zwischen Browserfenstern kommunizieren. Die einzige Möglichkeit, mit einem geöffneten Fenster von einem primären Fenster aus zu kommunizieren, besteht darin, die JavaScript-Referenz eines anderen Fensters zu verwenden. Sobald das primäre Fenster neu geladen oder an einen anderen Speicherort geleitet wird, gehen alle JavaScript-Verweise auf andere Fenster verloren. 5. Der realistischste Ansatz besteht darin, periodische JavaScript-XMLHTTP-Anforderungen (von jedem geöffneten Fenster) an den Server alle {Sitzung maximal inaktives Intervall} +10 Sekunden zu senden. Dies wird schließlich alle Fenster schließen,Dies kann jedoch dazu führen, dass Windows Minuten (oder sogar Stunden, abhängig von der Einstellung des Zeitlimits für Web-App-Sitzungen) geschlossen wird, nachdem die HTTP-Sitzung zerstört wurde, z. B. wenn sich der Benutzer innerhalb des primären Fensters abmeldet. Sie haben keine Optionen mehr, sind frustriert und denken, dass es genau der richtige Zeitpunkt ist, morgen die Waffe Ihres Vaters zu nehmen und Ihre Klassenkameraden in der Schule zu erschießen. Nein, noch nicht Kind - es gibt noch einen Ausweg! Der Ausweg ist nicht sehr einfach, aber sehr elegant. Cookies helfen uns. Man könnte denken, dass die Ablaufzeit von Cookies den Trick machen würde. Leider wie in beschriebenEs ist genau der richtige Zeitpunkt, um morgen die Waffe deines Vaters zu nehmen und deine Klassenkameraden in der Schule zu erschießen. Nein, noch nicht Kind - es gibt noch einen Ausweg! Der Ausweg ist nicht sehr einfach, aber sehr elegant. Cookies helfen uns. Man könnte denken, dass die Ablaufzeit von Cookies den Trick machen würde. Leider wie in beschriebenEs ist genau der richtige Zeitpunkt, um morgen die Waffe deines Vaters zu nehmen und deine Klassenkameraden in der Schule zu erschießen. Nein, noch nicht Kind - es gibt noch einen Ausweg! Der Ausweg ist nicht sehr einfach, aber sehr elegant. Cookies helfen uns. Man könnte denken, dass die Ablaufzeit von Cookies den Trick machen würde. Leider wie in beschrieben

diese

Artikel, Sie können sich nicht auf die Ablaufzeit von Cookies verlassen, da diese von einem Client-Browser gemessen wird, und niemand kann garantieren, dass die Uhr des Client-Systems nicht ein Jahr zurückliegt. Hier finden Sie das System und die Methode zum Verfolgen von HTTP-Sitzungszeitüberschreitungen in heterogenen Webanwendungen. Bei jeder Anforderung eines Browsers an einen Server werden zwei Cookies von einem Servlet-Filter gesetzt. Einer enthält die aktuelle Serverzeit und ein anderer die Ablaufzeit der Sitzung. Die aktuelle Serverzeit wird nur benötigt, um einen Offset zwischen Client und Server zu berechnen. Die Ablaufzeit der Sitzung wird dann regelmäßig mit der berechneten aktuellen Serverzeit verglichen (beachten Sie den Offset). Jedes Mal, wenn eine Anfrage an den Server gestellt wird, wird das Cookie für die Ablaufzeit aktualisiert und das Ganze funktioniert einfach. In der Praxis wird diese Methode in nur drei Schritten realisiert: 1.Erstellen Sie einen Servlet-Filter, der jede einzelne Anforderung an Ihre Webanwendung filtert. Konfigurieren Sie es in web.xml folgendermaßen:

  SessionTimeoutCookieFilter some.package.SessionTimeoutCookieFilter   SessionTimeoutCookieFilter /*  

Machen Sie sich keine Sorgen um die Leistung Ihrer Web-App - dieser Filter ist SEHR primitiv. Er fügt der Antwort lediglich zwei Cookies hinzu:

 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse httpResp = (HttpServletResponse) resp; HttpServletRequest httpReq = (HttpServletRequest) req; long currTime = System.currentTimeMillis(); long expiryTime = currTime + session.getMaxInactiveInterval() * 1000; Cookie cookie = new Cookie("serverTime", "" + currTime); cookie.setPath("/"); httpResp.addCookie(cookie); if (httpReq.getRemoteUser() != null) { cookie = new Cookie("sessionExpiry", "" + expiryTime); } else { cookie = new Cookie("sessionExpiry", "" + currTime); } cookie.setPath("/"); httpResponse.addCookie(cookie); filterChain.doFilter(req, resp); } 

Das Einstellen des Pfads (in unserem Fall auf "/") ist sehr wichtig. Wenn Sie die Pfadeinstellung weglassen, berechnet der Browser diese automatisch aus der URL, was zu einem Chaos im Speicher Ihres Browsers führt. 2. Wir benötigen in jedem Fenster ein kleines JavaScript, um den Versatz zwischen Server- und Clientzeit zu berechnen. Es muss nur einmal ausgeführt werden, aber es würde nicht schaden, es bei jedem Laden der Seite auszuführen:

 function calcOffset() { var serverTime = getCookie('serverTime'); serverTime = serverTime==null ? null : Math.abs(serverTime); var clientTimeOffset = (new Date()).getTime() - serverTime; setCookie('clientTimeOffset', clientTimeOffset); } window.onLoad = function() { calcOffset(); }; 

3. Und schließlich brauchen wir eine Funktion, die tatsächlich prüft, ob die Sitzung abgelaufen ist. Es muss regelmäßig ausgeführt werden, in unserem Fall alle 10 Sekunden (oder 10000 Millisekunden):

 function checkSession() { var sessionExpiry = Math.abs(getCookie('sessionExpiry')); var timeOffset = Math.abs(getCookie('clientTimeOffset')); var localTime = (new Date()).getTime(); if (localTime - timeOffset > (sessionExpiry+15000)) { // 15 extra seconds to make sure window.close(); } else { setTimeout('checkSession()', 10000); } } 

In der Tat ist das Schließen von Browserfenstern nach Ablauf der Sitzung reine Brutalität und kann und sollte von einer Warnmeldung begleitet werden, die etwa 1 Minute vor Ablauf der Sitzung angezeigt wird. Ich bin wirklich daran interessiert, Ihre zu erhalten

kritisches Feedback

auf meine Methode.

Diese Geschichte "Ablauf der Sitzung im Browser verfolgen" wurde ursprünglich von JavaWorld veröffentlicht.