Gestione dei cookie e di una sessione in un servlet Java

1. Panoramica

In questo tutorial, tratteremo la gestione dei cookie e delle sessioni in Java, utilizzando i servlet .

Inoltre, descriveremo brevemente cos'è un cookie ed esploreremo alcuni casi d'uso di esempio per esso.

2. Nozioni di base sui cookie

In poche parole, un cookie è una piccola porzione di dati archiviata sul lato client che i server utilizzano quando comunicano con i client .

Sono utilizzati per identificare un cliente quando si invia una richiesta successiva. Possono anche essere usati per passare alcuni dati da un servlet a un altro.

Per maggiori dettagli, fare riferimento a questo articolo.

2.1. Crea un cookie

La classe Cookie è definita nel pacchetto javax.servlet.http .

Per inviarlo al cliente, dobbiamo crearne uno e aggiungerlo alla risposta :

Cookie uiColorCookie = new Cookie("color", "red"); response.addCookie(uiColorCookie); 

Tuttavia, la sua API è molto più ampia: esploriamola.

2.2. Imposta la data di scadenza del cookie

Possiamo impostare la max age (con un metodo maxAge (int) ) che definisce per quanti secondi un dato cookie dovrebbe essere valido per:

uiColorCookie.setMaxAge(60*60); 

Abbiamo impostato un'età massima a un'ora. Trascorso questo tempo, il cookie non può essere utilizzato da un client (browser) durante l'invio di una richiesta e deve essere rimosso anche dalla cache del browser.

2.3. Imposta il dominio dei cookie

Un altro metodo utile nella Cookie API è setDomain (String) .

Questo ci consente di specificare i nomi di dominio a cui deve essere consegnato dal cliente. Dipende anche da se specifichiamo esplicitamente o meno il nome di dominio.

Impostiamo il dominio per un cookie:

uiColorCookie.setDomain("example.com");

Il cookie verrà consegnato ad ogni richiesta effettuata da example.com e dai suoi sottodomini.

Se non specifichiamo un dominio in modo esplicito, verrà impostato sul nome di dominio che ha creato un cookie .

Ad esempio, se creiamo un cookie da example.com e lasciamo il nome di dominio vuoto, verrà consegnato a www.example.com (senza sottodomini).

Insieme a un nome di dominio, possiamo anche specificare un percorso. Diamo un'occhiata a quello successivo.

2.4. Imposta il percorso dei cookie

Il percorso specifica dove verrà consegnato un cookie.

Se specifichiamo un percorso in modo esplicito, verrà consegnato un cookie all'URL specificato e tutte le sue sottodirectory:

uiColorCookie.setPath("/welcomeUser");

Implicitamente, verrà impostato sull'URL che ha creato un cookie e tutte le sue sottodirectory.

Ora concentriamoci su come possiamo recuperare i loro valori all'interno di un servlet .

2.5. Leggi i cookie nel servlet

I cookie vengono aggiunti alla richiesta del cliente. Il client controlla i suoi parametri e decide se può consegnarlo all'URL corrente.

Possiamo ottenere tutti i cookie chiamando getCookies () sulla richiesta ( HttpServletRequest ) passata al Servlet .

Possiamo iterare attraverso questo array e cercare quello di cui abbiamo bisogno, ad esempio confrontando i loro nomi:

public Optional readCookie(String key) { return Arrays.stream(request.getCookies()) .filter(c -> key.equals(c.getName())) .map(Cookie::getValue) .findAny(); }

2.6. Rimuovi un cookie

Per rimuovere un cookie da un browser, dobbiamo aggiungerne uno nuovo alla risposta con lo stesso nome, ma con un valore maxAge impostato a 0 :

Cookie userNameCookieRemove = new Cookie("userName", ""); userNameCookieRemove.setMaxAge(0); response.addCookie(userNameCookieRemove);

Un caso d'uso di esempio per la rimozione dei cookie è un'azione di logout dell'utente: potrebbe essere necessario rimuovere alcuni dati che sono stati memorizzati per una sessione utente attiva.

Ora sappiamo come gestire i cookie all'interno di un servlet .

Successivamente, tratteremo un altro oggetto importante a cui accediamo molto spesso da un servlet : un oggetto Session .

3. Oggetto HttpSession

Il HttpSession è un'altra opzione per la memorizzazione dei dati degli utenti relative tra le diverse richieste. Una sessione è una memoria lato server che contiene dati contestuali.

I dati non vengono condivisi tra diversi oggetti di sessione (il client può accedere ai dati solo dalla sua sessione). Contiene anche coppie chiave-valore, ma rispetto a un cookie, una sessione può contenere un oggetto come valore. Il meccanismo di implementazione dell'archiviazione dipende dal server.

Una sessione è abbinata a un client da un cookie o da parametri di richiesta. Maggiori informazioni possono essere trovate qui.

3.1. Ottenere una sessione

Possiamo ottenere una HttpSession direttamente da una richiesta:

HttpSession session = request.getSession(); 

Il codice precedente creerà una nuova sessione nel caso in cui non esista. Possiamo ottenere lo stesso chiamando:

request.getSession(true)

Nel caso in cui vogliamo solo ottenere una sessione esistente e non crearne una nuova, dobbiamo usare:

request.getSession(false) 

If we access the JSP page for the first time, then a new session gets created by default. We can disable this behavior by setting the session attribute to false:

In most cases, a web server uses cookies for session management. When a session object is created, then a server creates a cookie with JSESSIONID key and value which identifies a session.

3.2. Session Attributes

The session object provides a bunch of methods for accessing (create, read, modify, remove) attributes created for a given user session:

  • setAttribute(String, Object) which creates or replaces a session attribute with a key and a new value
  • getAttribute(String) which reads an attribute value with a given name (key)
  • removeAttribute(String) which removes an attribute with a given name

We can also easily check already existing session attributes by calling getAttributeNames().

As we already mentioned, we could retrieve a session object from a request. When we already have it, we can quickly perform methods mentioned above.

We can create an attribute:

HttpSession session = request.getSession(); session.setAttribute("attributeKey", "Sample Value"); 

The attribute value can be obtained by its key (name):

session.getAttribute("attributeKey"); 

We can remove an attribute when we don't need it anymore:

session.removeAttribute("attributeKey"); 

A well-known use case for a user session is to invalidate whole data it stores when a user logs out from our website. The session object provides a solution for it:

session.invalidate(); 

This method removes the whole session from the web server so we cannot access attributes from it anymore.

L' oggetto HttpSession ha più metodi, ma quelli che abbiamo menzionato sono i più comuni.

4. Conclusione

In questo articolo, abbiamo coperto due meccanismi che ci consentono di memorizzare i dati dell'utente tra le successive richieste al server: il cookie e la sessione.

Tieni presente che il protocollo HTTP è senza stato e quindi mantenere lo stato tra le richieste è un must.

Come sempre, gli snippet di codice sono disponibili su GitHub.