Les cookies et la session
Les cookies
- Une variable conservée du côté client dans le navigateur.
- Pratique pour stocker, par exemple, les préférences de l'utilisateur.
- Stockés sous un format clé-valeur
- Les cookies sont généralement associés à une page ou à une partie de l'application. Toutes les requêtes à partir de cette page enverront également les cookies au serveur.
Attributs courants des cookies
name: Le nom du cookie (la portion clé)value: La valeur stockée dans le cookieMax age: La durée de vie du cookieHttp Only: Un cookie Http Only ne peut pas être manipulé par JavaScriptSecure: Un cookie secure sera transmis vis les requêtes Https seulement.Path: Le chemin de l'applicaiton auquel le cookie est lié. Si la valeur est/le cookie est disponible pour toute l'application.
Manipuler les cookies avec Spring
Less cookies sont transmis avec la requête Http, il est donc possible de les récupérer directement de la requête.
Cookie[] cookies = request.getCookies();
for(Cookie cookie: cookies){
// Code pour gérer le cookie
if(cookie.getName().equals(“myCookie”){
...
}
}
Cependant, il faut récupérer tous les cookies et essayer de trouver ceux que l'on veut un par un. Spring nous offre une façon beaucoup plus simple et élégante de le faire.
- On ajoute un paramètre à une méthode d'action avec le décorateur
@CookieValue. - À ce décorateur on passe
value: Le nom du cookie à récupérerdefaultValue: Une valeur à utiliser par défaut si le cookie n'est pas trouvé
@GetMpping("/hello")
public String bonjour(
Model model,
// Récupère le cookie username et attribue sa valeur à ce paramètre
@CookieValue(value="username", defaultValue="World") String username
) {
model.addAttribute("nom", username);
return "salutations";
}
De cette façon on récupère facilement un cookie spécifique rapidement et gérer le cas où le cookie n'est pas disponible.
Créer un cookie et l'envoyer au client
Pour envoyer un cookie au client, il faudra absoluement utiliser la réponse, un objet de type HttpServletResponse.
Pour créer un cookie, on utilisera la classe Cookie de jakarta.servlet.http.Cookie.
// Extrait d'une méthode d'action qui ajoute un cookie
// Initialiser le cookie avec un nom et une valeur
Cookie themeCookie = new Cookie("theme", "clair");
themeCookie.setMaxAge(3600);
themeCookie.setPath("/");
themeCookie.setHttpOnly(true);
response.addCookie(themeCookie);
- Dans l'exemple ci-dessus, je crée un cookie qui a pour nom "theme" et pour valeur "clair".
- Le chemin (path) étaint
/rendra le cookie disponible sur tout le site - Sa durée de vie est de 1 heure (3600 secondes)
- J'ajoute le cookie à la réponse, il sera donc envoyé avec la page JSP qui sera retournée à l'utilisateur.
Durée de vie d'un cookie
Un cookie sera envoyé avec les requêtes tant et aussi longtemps qu'il n'est pas expiré, ou que l'utilisateur supprime le cookie.
Il est impossible de créer un cookie sans expiration. Toutefois, on peut lui donner une durée de vie très longue si on veut éviter qu'il expire.
La session
Tout comme dans les applications avec les Servlet Java, on peut donner en paramètre à nos méthodes d'action un objet de type HttpSession et le manipuler directement.
Spring nous offre toutefois une autre méthode de manipuler la session en associant les attributs de la session aux contrôleurs.
Ceci se fera avec le décorateur @SessionAttributes qu'on appliquera au niveau du contrôleur.
@Controller
// Si on initialise un seul attribut on peut ignorer les accolades
@SessionAttributes({"monAttribut", "message"})
public class HomeController{
/* ... */
}
Dans l'exemple ci-dessus je déclare deux variables de session, soit monAttribut et message.
On peut ensuite créer des méthodes pour initialiser ces variables.
@Controller
@SessionAttributes({"monAttribut", "message"})
public class HomeController{
@ModelAttribute("monAttribut")
public String demo() {
return "Contenu de monAttribut";
}
@ModelAttribute("message")
public String message() {
return "Le message du jour";
}
@GetMapping("/")
public String home() {
return "home";
}
}
Attributs complexes
Notez qu'il serait également possible de donner un objet complexe à un attribut de session, par exemple un onjet Utilisateur.
Cycle de vie de la session Spring
Spring gère le tout à sa propre façon.
Les attributs de session qui sont générés via @SessionAttributes n'existeront pas tant que le contrôleur auquel elles sont associées n'ont pas été appelés au moins une fois.
Lors d'un appel à un contrôleur, ce dernier vérifiera si l'attribut de la session existe. Si c'est le cas, il ne fera rien de plus. Si un attribut n'existe pas, le serveur exécutera la méthode avec le décorateur @ModelAttribute qui est équivalent. Il génèrera la valeur et la sauvegarde alors dans la session.
Reprenons l’exemple de HomeController
Lorsque je fais un appel à mon point de terminaison "/", le contrôleur vérifie si les attributs de session "monAttribut" et "message" existent présentement dans la session. S’ils n’existent pas, il exécutera les méthodes demo() et message() qui eux génèrent les valeurs à stocker dans la session. Une fois ces méthodes appelées, la session contiendra les attributs "monAttribut" et "message" qui contiendront respectivement le résultat des méthodes demo() et message().