Gestion des cookies et d'une session dans un servlet Java

1. Vue d'ensemble

Dans ce tutoriel, nous aborderons la gestion des cookies et des sessions en Java, à l'aide de servlets .

De plus, nous décrirons brièvement ce qu'est un cookie et explorerons quelques exemples de cas d'utilisation.

2. Principes de base des cookies

En termes simples, un cookie est un petit élément de données stocké côté client que les serveurs utilisent lorsqu'ils communiquent avec les clients .

Ils sont utilisés pour identifier un client lors de l'envoi d'une demande ultérieure. Ils peuvent également être utilisés pour transmettre certaines données d'un servlet à un autre.

Pour plus de détails, veuillez consulter cet article.

2.1. Créer un cookie

La classe Cookie est définie dans le package javax.servlet.http .

Pour l'envoyer au client, nous devons en créer un et l'ajouter à la réponse :

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

Cependant, son API est beaucoup plus large - explorons-la.

2.2. Définir la date d'expiration du cookie

Nous pouvons définir l'âge maximum (avec une méthode maxAge (int) ) qui définit combien de secondes un cookie donné doit être valide pendant:

uiColorCookie.setMaxAge(60*60); 

Nous avons fixé un âge maximum à une heure. Passé ce délai, le cookie ne peut pas être utilisé par un client (navigateur) lors de l'envoi d'une demande et il doit également être supprimé du cache du navigateur.

2.3. Définir le domaine du cookie

Une autre méthode utile dans l' API Cookie est setDomain (String) .

Cela nous permet de spécifier les noms de domaine auxquels il doit être livré par le client. Cela dépend également si nous spécifions le nom de domaine explicitement ou non.

Définissons le domaine pour un cookie:

uiColorCookie.setDomain("example.com");

Le cookie sera livré à chaque demande faite par example.com et ses sous-domaines.

Si nous ne spécifions pas explicitement un domaine, il sera défini sur le nom de domaine qui a créé un cookie .

Par exemple, si nous créons un cookie à partir de example.com et laissons le nom de domaine vide, il sera livré à www.example.com (sans sous-domaines).

Avec un nom de domaine, nous pouvons également spécifier un chemin. Jetons un coup d'œil à cela ensuite.

2.4. Définir le chemin du cookie

Le chemin spécifie où un cookie sera livré.

Si nous spécifions un chemin explicitement, un cookie sera livré à l'URL donnée et à tous ses sous-répertoires:

uiColorCookie.setPath("/welcomeUser");

Implicitement, il sera défini sur l'URL qui a créé un cookie et tous ses sous-répertoires.

Concentrons-nous maintenant sur la façon dont nous pouvons récupérer leurs valeurs dans un servlet .

2.5. Lire les cookies dans le servlet

Des cookies sont ajoutés à la demande du client. Le client vérifie ses paramètres et décide s'il peut le livrer à l'URL actuelle.

Nous pouvons obtenir tous les cookies en appelant getCookies () sur la requête ( HttpServletRequest ) transmise au Servlet .

Nous pouvons parcourir ce tableau et rechercher celui dont nous avons besoin, par exemple en comparant leurs noms:

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

2.6. Supprimer un cookie

Pour supprimer un cookie d'un navigateur, nous devons en ajouter un nouveau à la réponse avec le même nom, mais avec une valeur maxAge définie sur 0 :

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

Un exemple de cas d'utilisation pour supprimer les cookies est une action de déconnexion de l'utilisateur - nous pouvons avoir besoin de supprimer certaines données qui ont été stockées pour une session utilisateur active.

Nous savons maintenant comment gérer les cookies dans un servlet .

Ensuite, nous aborderons un autre objet important auquel nous accédons très souvent à partir d'un servlet - un objet Session .

3. Objet HttpSession

Le HttpSession est une autre option pour stocker des données liées à l' utilisateur pour des demandes différentes. Une session est un stockage côté serveur contenant des données contextuelles.

Les données ne sont pas partagées entre différents objets de session (le client ne peut accéder aux données qu'à partir de sa session). Il contient également des paires clé-valeur, mais par rapport à un cookie, une session peut contenir un objet comme valeur. Le mécanisme de mise en œuvre du stockage dépend du serveur.

Une session est mise en correspondance avec un client par un cookie ou des paramètres de requête. Plus d'informations peuvent être trouvées ici.

3.1. Obtenir une session

Nous pouvons obtenir une HttpSession directement à partir d'une requête:

HttpSession session = request.getSession(); 

Le code ci-dessus créera une nouvelle session au cas où elle n'existerait pas. Nous pouvons réaliser la même chose en appelant:

request.getSession(true)

Dans le cas où nous voulons simplement obtenir une session existante et ne pas en créer une nouvelle, nous devons utiliser:

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' objet HttpSession a plus de méthodes, mais celle que nous avons mentionnée est la plus courante.

4. Conclusion

Dans cet article, nous avons abordé deux mécanismes qui nous permettent de stocker des données utilisateur entre les demandes ultérieures au serveur - le cookie et la session.

Gardez à l'esprit que le protocole HTTP est sans état et que le maintien de l'état entre les demandes est donc indispensable.

Comme toujours, des extraits de code sont disponibles à l'adresse over sur Github.