Vor ein paar Tagen, als ich an einem Check-in-System arbeitete, stieß ich auf ein beliebtes Sitzungsproblem. Das Projekt ist Spring+SpringMVC+MyBatis Framework, das Javaweb-Seite-System des Maven-Management-Verzeichnisses. Für einige Sitzungen der Sitzung wird die folgende Analyse durchgeführt. Hier konzentrieren wir uns auf das Problem des Sitzungslebenszyklus. Was andere Definitionen betrifft, werden wir nicht erklären:
Erklären wir zunächst den Lebenszyklus der Sitzung:
Speicherung: Die Sitzung wird auf der Serverseite gespeichert. Um zu verhindern, dass es im Serverspeicher gespeichert wird (für Hochgeschwindigkeitszugriff), wird Sessinon im Allgemeinen erstellt, wenn der Benutzer zum ersten Mal auf den Server zugreift. Es ist zu beachten, dass die Sitzung nur beim Zugriff auf JSP, Servlet und andere Programme erstellt wird. Der Zugriff auf statische Ressourcen wie HTML und Image erstellt keine Sitzung. In einer Javaweb -Anwendung können Sie Request.GetSession (boolean XXX) anrufen, um eine Sitzung zu generieren. Beachten Sie, dass wenn der boolesche Parameter wahr ist, eine neue Sitzung hier generiert werden muss.
1. Ausstandszeitzeit:
Die Sitzung läuft ab, nachdem das letzte Mal, als die Sitzung verwendet wurde, die festgelegte Ausfallzeit erreicht.
2. Eine andere Methodensitzung.invalidate () wird ausgeführt, die die Sitzung aktiv ungültig macht.
Zur Ungültigheitszeit können Sie es definieren, indem Sie Eigenschaften in web.xml konfigurieren:
<Sesion-Config> <Session-Timeout> Ablaufzeit </Session-Timeout> </Session-Config>
Die Ausfallzeit ist Minuten. Wenn die Sitzung für einen Tag gültig ist, kann sie auf 60*24 festgelegt werden. Wenn die Sitzung auf 0 oder negativ eingestellt ist, ist die Sitzung dauerhaft gültig. Nach der Definition der Fehlerzeit ist es leicht, diese Situation zu verstehen.
Warum scheitert die Sitzung, nachdem der Browser geschlossen ist?
Basierend auf dem, was bekannt ist, wurde ein einfaches Beispiel geschrieben:
@ControllerPublic class SessionTest {@RequestMapping ("/sessiontest") public String Sessiontest (httpServletRequest -Anfrage, httpServletResponse -Antwort) {System.out.println ("Erfolg!"); HttpSession Session = Request.GetSession (); Session.setMaxinActiveInterval (259200); Request.SetatTribute ("CreationTime", Session.getCreationTime ()); // Erstellungszeitanforderung. Die Einheit ist zweite Anforderung. System.out.println (session.getLastAcesseTime ()); zurück "Seite/ShowSession"; } <table Cellpacing = "0" cellpadding = "0"> <tr> <td> Erstellungszeit: </td> <td> $ {CreationTime} </td> </tr> <tr> <td> id: </td> <td> $ {id} </td> </tr> <tr> <Td> Maximum {td> </tr> <Td> Maximum {td> </tr> <Td> maximalalumalus} </td> </tr> <Td> Maximum, Maximum} </td> </tr> <Td> Maximum, Maximum} </td> </tr> <Td> Maximum, Maximum} </td> </tr> <Td> Maximum, maximal {td> </tr> <Td> Maximum} </td> </tr> <Td> Maximum. Zeit: </td> <td> $ {max} </td> </tr> <tr> <td> Letztes Mal verwendet: </td> <td> $ {lastTime} </td> </tr> <tr> <Td> Sitzung: </td> <td> $ {sessiontest} </td> </ttrd> </trid> </trid> </trid>Analyse:
Es ist zu erkennen, dass die Ungültigheitszeit der Sitzung tatsächlich dann der Fall ist, wenn der Browser geschlossen ist. Nur wenn der Browser nicht schließt und erneut zugreift, können Sie den Anmeldeszustand weiterhin verwenden. Was repräsentiert die oben festgelegte Invalidierungszeit?
Es wurde eine Sitzung zwischen dem Browser und dem Server erstellt. Da der Client lange Zeit nicht mit dem Server interagierte (Winterschlafzeit), zerstörte der Server diese Sitzung. Die vorherige Sitzung, als der Client erneut mit dem Server interagierte, gab es nicht. Mein Verständnis ist, dass die Invalidierungszeit während einer Sitzung nur wirksam wird. Wenn der Browser geschlossen ist und die Sitzung endet, wird die Ungültigheitszeit auf dauerhaft gültig gesetzt. Dies ist der Moment, in dem der Browser geschlossen und die Sitzung geschlossen ist. Um dieses Problem zu lösen, können Sie Cookies mit Sitzungen mischen. Es gibt einen so dummen Weg:
Fügen Sie aktiv Cookies hinzu, um das Save -Verzeichnis und die Überlebenszeit festzulegen
public static void addoCookie (String-Name, Stringwert, int Alter, httpServletResponse-Antwort) löst nicht unterstütztenCodingException aus (Cookie c = neuer Cookie (Name, urlencoder.encode (Wert, "utf-8"); C.SetMaxage (Alter); C.SetPath (Pfad); response.addcookie (c); }
Verwenden Sie bei erneutem Zugriff Cookie[] cookies = request.getCookies(); Um die Kekse zu durchqueren, erhalten Sie den gewünschten Keks gemäß dem Namen des Keks, oder es kann gesagt werden, dass es sich um eine Sitzung handelt. Schließlich erhalten Sie das gewünschte Ergebnis, und die Sitzung (das Cookie namens JSESSIONID) entkommt aus der Inhaftierung des Browsers.
Zusammenfassen
Die oben genannte Lösung für das Problem des Ausfalls des J2EE-Session nach dem Schließen des Browsers. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!