4.1 Introduzione a HttpSession

Se più richieste provengono dallo stesso client, dicono che è stata stabilita una sessione tra il client e il server. Per controllare questo processo, il contenitore ha uno speciale oggetto HttpSession.

Quando un client effettua una richiesta a un servlet, il servlet container controlla se il parametro ID di sessione è presente nella richiesta. Se non esiste tale parametro (ad esempio, il client sta contattando il server per la prima volta), il servlet container crea un nuovo oggetto HttpSession e gli assegna anche un ID univoco.

L'oggetto sessione viene archiviato sul server e l'ID viene inviato nella risposta al client e, per impostazione predefinita, viene archiviato sul client in un cookie. Quindi, quando arriva una nuova richiesta dallo stesso client, il contenitore servlet recupera l'ID da esso e tramite tale ID trova l'oggetto HttpSession corretto sul server.

È possibile ottenere l'oggetto sessione da una richiesta (un oggetto HttpServletRequest), su cui è necessario chiamare il metodo getSession(). Restituisce un oggetto HttpSession.

Perché è necessaria una sessione? Può memorizzare informazioni sul client tra le chiamate. Ha qualcosa come una HashMap all'interno, in cui puoi memorizzare oggetti tramite chiavi. E alcuni metodi per questo:

Metodi Descrizione
1 setAttribute(String name, Object o) Aggiunge un oggetto alla sessione
2 getAttribute(String name) Ottiene un oggetto dalla sessione
3 removeAttribute(String name) Rimuove un oggetto dalla sessione

Scriviamo un servlet che riassumerà tutti i numeri passati ad esso da diverse richieste:

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 Ulteriori informazioni su HttpSession

C'è qualcos'altro che non abbiamo detto sull'oggetto HttpSession?

Innanzitutto, è il nome J SESSION ID. È sotto di esso che l'ID di sessione viene memorizzato nei cookie. Come puoi vedere, è abbastanza facile da ricordare: J+SESSION+ID.

In secondo luogo, la sessione ha alcuni metodi più utili:

Metodi Descrizione
1 getAttributeNames() Restituisce un elenco di tutte le chiavi archiviate nella sessione
2 getId() Restituisce l'ID di sessione (stringa)
3 isNew() Restituisce true se l'oggetto sessione è stato creato nella richiesta corrente
4 setMaxInactiveInterval(int seconds) Imposta l'intervallo di inattività della sessione in secondi
5 invalidate() Rimuove tutti gli oggetti dalla sessione

Qui tutti i metodi sono ovvi, ma setMaxInactiveInterval()ne parleremo un po 'di più.

Se il server memorizza decine di migliaia di sessioni, inclusi i dati dei clienti che lo hanno visitato il mese scorso, la memoria sarà semplicemente esaurita. Pertanto, esiste un modo per impostare la "durata della sessione".

Se nessuno ha utilizzato la sessione per un intervallo di tempo, si cancella da sola: tutti gli oggetti che ha memorizzato vengono eliminati da essa. Questo viene fatto per risparmiare memoria.

Per impostazione predefinita, questo intervallo è di 1800 secondi == 30 minuti. Se imposti il ​​​​valore su -1, la sessione sarà "eterna" e verrà eliminata solo quando l'utente chiude la scheda del browser (beh, o il client si disconnette).

Esempi:

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