4.1 Einführung in HttpSession

Kommen mehrere Anfragen vom selben Client, spricht man davon, dass eine Sitzung zwischen Client und Server aufgebaut wurde. Um diesen Prozess zu steuern, verfügt der Container über ein spezielles HttpSession-Objekt.

Wenn ein Client eine Anfrage an ein Servlet stellt, prüft der Servlet-Container, ob der Sitzungs-ID-Parameter in der Anfrage vorhanden ist. Wenn kein solcher Parameter vorhanden ist (z. B. wenn der Client den Server zum ersten Mal kontaktiert), erstellt der Servlet-Container ein neues HttpSession-Objekt und weist ihm außerdem eine eindeutige ID zu.

Das Sitzungsobjekt wird auf dem Server gespeichert und die ID wird in der Antwort an den Client gesendet und standardmäßig auf dem Client in einem Cookie gespeichert. Wenn dann eine neue Anfrage vom selben Client eingeht, ruft der Servlet-Container die ID von ihm ab und findet anhand dieser ID das richtige HttpSession-Objekt auf dem Server.

Sie können das Sitzungsobjekt aus einer Anfrage (einem HttpServletRequest-Objekt) abrufen, für die Sie die Methode getSession() aufrufen müssen. Es gibt ein HttpSession-Objekt zurück.

Warum ist eine Sitzung erforderlich? Es kann Informationen über den Client zwischen Anrufen speichern. Sie hat so etwas wie eine HashMap im Inneren, in der man Objekte per Schlüssel speichern kann. Und einige Methoden dafür:

Methoden Beschreibung
1 setAttribute(String name, Object o) Fügt der Sitzung ein Objekt hinzu
2 getAttribute(String name) Ruft ein Objekt aus der Sitzung ab
3 removeAttribute(String name) Entfernt ein Objekt aus der Sitzung

Schreiben wir ein Servlet, das alle ihm von verschiedenen Anfragen übergebenen Zahlen zusammenfasst:

public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Get the "sum" attribute from the session
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Handling the situation when the session does not yet have such an attribute
        if (sum == null)
            sum = 0;

         // Get the "n" parameter from the request
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);

         // Write the "sum" attribute to the session
        session.setAttribute("sum", sum);

        // Print the HTML as a response to the browser
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head> <title> CalculatorServlet </title> </head>");
        out.println("<body>");
        out.println("<h1> Sum == " + sum + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4.2 Mehr über HttpSession

Gibt es noch etwas, was wir über das HttpSession-Objekt nicht gesagt haben?

Erstens ist es der Name J SESSION ID. Darunter wird die Session-ID in Cookies gespeichert. Wie Sie sehen, ist es ziemlich einfach, sich Folgendes zu merken: J+SESSION+ID.

Zweitens verfügt die Sitzung über einige weitere nützliche Methoden:

Methoden Beschreibung
1 getAttributeNames() Gibt eine Liste aller in der Sitzung gespeicherten Schlüssel zurück
2 getId() Gibt die Sitzungs-ID (Zeichenfolge) zurück.
3 isNew() Gibt true zurück, wenn das Sitzungsobjekt in der aktuellen Anfrage erstellt wurde
4 setMaxInactiveInterval(int seconds) Legt das Sitzungsinaktivitätsintervall in Sekunden fest
5 invalidate() Entfernt alle Objekte aus der Sitzung

Hier sind alle Methoden offensichtlich, aber setMaxInactiveInterval()wir werden noch etwas mehr besprechen.

Wenn der Server Zehntausende Sitzungen speichert, einschließlich der Daten von Clients, die ihn im letzten Monat besucht haben, dann geht ihm einfach der Speicher aus. Daher gibt es eine Möglichkeit, die „Sitzungslebensdauer“ festzulegen.

Wenn die Sitzung über einen bestimmten Zeitraum hinweg von niemandem genutzt wurde, löscht sie sich selbst – alle darin gespeicherten Objekte werden daraus gelöscht. Dies geschieht, um Speicherplatz zu sparen.

Standardmäßig beträgt dieses Intervall 1800 Sekunden == 30 Minuten. Wenn Sie den Wert auf -1 setzen, ist die Sitzung „ewig“ und wird nur gelöscht, wenn der Benutzer die Browser-Registerkarte schließt (oder wenn der Client die Verbindung trennt).

Beispiele:

// get all keys
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}
// set the inactivity interval
session.setMaxInactiveInterval(60*60*24);   // 1 day
session.setMaxInactiveInterval(-1); // until the browser is closed
// remove all data from the session
session.invalidate();