4.1 Introducere în HttpSession

Dacă mai multe solicitări vin de la același client, atunci ei spun că s-a stabilit o sesiune între client și server. Pentru a controla acest proces, containerul are un obiect special HttpSession.

Când un client face o solicitare către un servlet, containerul de servlet verifică dacă parametrul ID de sesiune este prezent în cerere. Dacă nu există un astfel de parametru (de exemplu, clientul contactează serverul pentru prima dată), atunci containerul servlet creează un nou obiect HttpSession și îi atribuie, de asemenea, un ID unic.

Obiectul sesiune este stocat pe server, iar ID-ul este trimis în răspunsul către client și implicit este stocat pe client într-un cookie. Apoi, când o nouă solicitare vine de la același client, containerul servlet preia ID-ul de la acesta și, prin acel ID, găsește obiectul HttpSession corect pe server.

Puteți obține obiectul sesiune dintr-o cerere (un obiect HttpServletRequest), pe care trebuie să apelați metoda getSession(). Returnează un obiect HttpSession.

De ce este nevoie de o sesiune? Poate stoca informații despre client între apeluri. Ea are ceva ca un HashMap înăuntru, în care poți stoca obiecte după chei. Și câteva metode pentru asta:

Metode Descriere
1 setAttribute(String name, Object o) Adaugă un obiect la sesiune
2 getAttribute(String name) Obține un obiect din sesiune
3 removeAttribute(String name) Elimină un obiect din sesiune

Să scriem un servlet care va însuma toate numerele transmise lui din diferite solicitări:

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 Mai multe despre HttpSession

Mai este ceva ce nu am spus despre obiectul HttpSession?

În primul rând, este numele J SESSION ID. Sub acesta este stocat ID-ul sesiunii în cookie-uri. După cum puteți vedea, este destul de ușor de reținut: J+SESSION+ID.

În al doilea rând, sesiunea are câteva metode mai utile:

Metode Descriere
1 getAttributeNames() Returnează o listă cu toate cheile stocate în sesiune
2 getId() Returnează ID-ul sesiunii (șir)
3 isNew() Returnează true dacă obiectul sesiune a fost creat în cererea curentă
4 setMaxInactiveInterval(int seconds) Setează intervalul de inactivitate a sesiunii în secunde
5 invalidate() Elimină toate obiectele din sesiune

Aici toate metodele sunt evidente, dar setMaxInactiveInterval()despre un pic mai vorbim.

Dacă serverul stochează zeci de mii de sesiuni, inclusiv datele clienților care l-au vizitat luna trecută, atunci pur și simplu va rămâne fără memorie. Prin urmare, există o modalitate de a seta „durata de viață a sesiunii”.

Dacă nimeni nu a folosit sesiunea pentru un interval de timp, atunci se șterge singură - toate obiectele pe care le-a stocat sunt șterse din ea. Acest lucru se face pentru a economisi memorie.

În mod implicit, acest interval este de 1800 de secunde == 30 de minute. Dacă setați valoarea la -1, atunci sesiunea va fi „eternă” și va fi ștearsă numai atunci când utilizatorul închide fila browserului (bine, sau clientul se deconectează).

Exemple:

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