4.1 Wprowadzenie do HttpSession

Jeśli kilka żądań pochodzi od tego samego klienta, oznacza to, że między klientem a serwerem została ustanowiona sesja. Aby kontrolować ten proces, kontener posiada specjalny obiekt HttpSession.

Gdy klient wysyła żądanie do serwletu, kontener serwletu sprawdza, czy w żądaniu występuje parametr identyfikatora sesji. Jeśli nie ma takiego parametru (np. klient kontaktuje się z serwerem po raz pierwszy), wówczas kontener serwletu tworzy nowy obiekt HttpSession, a także przypisuje mu unikalny identyfikator.

Obiekt sesji jest przechowywany na serwerze, a identyfikator jest wysyłany w odpowiedzi do klienta i domyślnie jest przechowywany na kliencie w pliku cookie. Następnie, gdy nowe żądanie przychodzi od tego samego klienta, kontener serwletu pobiera od niego identyfikator i na podstawie tego identyfikatora znajduje właściwy obiekt HttpSession na serwerze.

Możesz pobrać obiekt sesji z żądania (obiekt HttpServletRequest), na którym musisz wywołać metodę getSession(). Zwraca obiekt HttpSession.

Dlaczego potrzebna jest sesja? Może przechowywać informacje o kliencie pomiędzy połączeniami. Ma w środku coś w rodzaju HashMapy, w której można przechowywać obiekty według kluczy. I kilka sposobów na to:

Metody Opis
1 setAttribute(String name, Object o) Dodaje obiekt do sesji
2 getAttribute(String name) Pobiera obiekt z sesji
3 removeAttribute(String name) Usuwa obiekt z sesji

Napiszmy serwlet, który zsumuje wszystkie liczby przekazane do niego z różnych żądań:

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 Więcej o HttpSession

Czy jest coś jeszcze, czego nie powiedzieliśmy o obiekcie HttpSession?

Po pierwsze, jest to nazwa J SESSION ID. To pod nim w plikach cookies przechowywany jest identyfikator sesji. Jak widać, jest to dość łatwe do zapamiętania: J+SESSION+ID.

Po drugie, sesja ma jeszcze kilka przydatnych metod:

Metody Opis
1 getAttributeNames() Zwraca listę wszystkich kluczy przechowywanych w sesji
2 getId() Zwraca identyfikator sesji (ciąg znaków)
3 isNew() Zwraca wartość true, jeśli obiekt sesji został utworzony w bieżącym żądaniu
4 setMaxInactiveInterval(int seconds) Ustawia interwał braku aktywności sesji w sekundach
5 invalidate() Usuwa wszystkie obiekty z sesji

Tutaj wszystkie metody są oczywiste, ale setMaxInactiveInterval()porozmawiamy o tym trochę więcej.

Jeśli serwer przechowuje dziesiątki tysięcy sesji, w tym dane klientów, którzy odwiedzili go w zeszłym miesiącu, po prostu zabraknie mu pamięci. Dlatego istnieje sposób na ustawienie „czasu życia sesji”.

Jeśli nikt nie korzystał z sesji przez określony czas, to się ona sama czyści - usuwane są z niej wszystkie przechowywane przez nią obiekty. Odbywa się to w celu oszczędzania pamięci.

Domyślnie ten interwał wynosi 1800 sekund == 30 minut. Jeśli ustawisz wartość -1, sesja będzie „wieczna” i zostanie usunięta tylko wtedy, gdy użytkownik zamknie kartę przeglądarki (cóż, lub klient się rozłączy).

Przykłady:

// 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();