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

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

1. Vue d'ensemble

Dans ce didacticiel, nous aborderonsthe handling of cookies and sessions in Java, using Servlets.

En outre, nous allons décrire brièvement ce qu'est un cookie et explorer quelques exemples de cas d'utilisation.

En termes simples,a cookie is a small piece of data stored on the client-side which servers use when communicating with clients.

They’re used to identify a client lors de l'envoi d'une requête ultérieure. Ils peuvent également être utilisés pour transmettre certaines données d'un servlet à un autre.

Pour plus de détails, veuillez vous référer àto this article.

La classeCookie est définie dans le packagejavax.servlet.http.

Pour l'envoyer au client, nous avons besoin decreate one and add it to the response:

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

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

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

uiColorCookie.setMaxAge(60*60);

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

Une autre méthode utile dans l'APICookie estsetDomain(String).

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

Définissons le domaine pour un cookie:

uiColorCookie.setDomain("example.com");

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

If we don’t specify a domain explicitly, it will be set to the domain namewhich created a cookie.

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

Avec un nom de domaine, nous pouvons également spécifier un chemin. Voyons cela ensuite.

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

Si nous spécifions un chemin explicitement, alors unCookie 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 à l'intérieur d'unServlet.

2.5. Lire les cookies dans le servlet

Les cookies sont ajoutés à la demande par le client. Le client vérifie ses paramètres et décide s’il peut le transmettre à l’URL actuelle.

Nous pouvons obtenir tous les cookies en appelantgetCookies() sur la requête (HttpServletRequest) passée auServlet.

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

Toremove a cookie from a browser, we have to add a new one to the response with the same name, but with a maxAge value set to 0:

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

Un exemple de cas d'utilisation pour la suppression des cookies est une action de déconnexion de l'utilisateur. Il peut être nécessaire de supprimer certaines données stockées pour une session utilisateur active.

Nous savons maintenant comment gérer les cookies à l'intérieur d'unServlet.

Ensuite, nous allons couvrir un autre objet important auquel nous accédons très souvent depuis un objetServlet - un objetSession.

3. ObjetHttpSession

LeHttpSession est une autre option pour stocker les données relatives aux utilisateurs sur différentes demandes. 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 en comparaison d'un cookie, une session peut contenir un objet en tant que valeur. Le mécanisme de mise en œuvre du stockage dépend du serveur.

Une session est associée à un client par un cookie ou des paramètres de demande. Plus d'informations peuvent être trouvéeshere.

3.1. Obtenir une session

On peut obtenir unHttpSession 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)

Si nous voulons simplement obtenir une session existante sans en créer une nouvelle, nous devons utiliser:

request.getSession(false)

Si nous accédons à la page JSP pour la première fois, une nouvelle session est créée par défaut. Nous pouvons désactiver ce comportement en définissant l'attributsession surfalse:

<%@ page contentType="text/html;charset=UTF-8" session="false" %>

Dans la plupart des cas, un serveur Web utilise des cookies pour la gestion de session. Lorsqu'un objet de session est créé, un serveur crée un cookie avec la clé et la valeurJSESSIONID qui identifie une session.

3.2. AttributsSession

L'objet de session fournit un tas de méthodes pour accéder aux attributs (créer, lire, modifier, supprimer) créés pour une session utilisateur donnée:

  • setAttribute(String, Object) qui crée ou remplace un attribut de session par une clé et une nouvelle valeur

  • getAttribute(String) qui lit une valeur d'attribut avec un nom donné (clé)

  • removeAttribute(String) qui supprime un attribut avec un nom donné

Nous pouvons également facilement vérifier les attributs de session déjà existants en appelantgetAttributeNames().

Comme nous l'avons déjà mentionné, nous pourrions récupérer un objet de session à partir d'une demande. Lorsque nous l'avons déjà, nous pouvons rapidement effectuer les méthodes mentionnées ci-dessus.

Nous pouvons créer un attribut:

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

La valeur de l'attribut peut être obtenue par sa clé (nom):

session.getAttribute("attributeKey");

Nous pouvons supprimer un attribut lorsque nous n'en avons plus besoin:

session.removeAttribute("attributeKey");

Un cas d'utilisation bien connu pour une session d'utilisateur consiste à invalider l'ensemble des données qu'elle stocke lorsqu'un utilisateur se déconnecte de notre site Web. L'objet de session fournit une solution pour cela:

session.invalidate();

Cette méthode supprime toute la session du serveur Web afin que nous ne puissions plus y accéder aux attributs.

L'objetHttpSession a plus de méthodes, mais celle que nous avons mentionnée est la plus courante.

4. Conclusion

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

N'oubliez pas que le protocole HTTP est sans état et qu'il est donc essentiel de maintenir l'état des demandes.

Comme toujours, des extraits de code sont disponiblesover on Github.