web-dev-qa-db-fra.com

Meilleure option pour la gestion de session dans Java

Meilleure façon de gérer la session en Java. J'ai entendu dire que les cookies ne sont pas une option fiable pour cela car ils sont stockés dans le navigateur et peuvent être consultés plus tard? Est-ce correct? Si possible, veuillez fournir les réponses avec l'exemple de codage.

Quel est le meilleur parmi:

  • Réécriture d'URL: le serveur ajoutera un paramètre supplémentaire à la fin du lien URL
  • paramètre caché dans le formulaire: le serveur ajoutera un paramètre supplémentaire à chaque formulaire en HTML
  • cookie: le serveur demandera au navigateur de conserver un cookie.
52

La gestion de session (identification du client, gestion des cookies, sauvegarde des données de portée de session, etc.) est essentiellement déjà effectuée par le serveur d'applications lui-même. Vous n'avez pas du tout à vous en préoccuper. Vous pouvez simplement définir/obtenir Java objets dans la session par HttpSession#setAttribute() et #getAttribute() . La seule chose dont vous devez vraiment vous occuper est la réécriture d'URL dans le cas où le client ne prend pas en charge les cookies. Il ajoutera ensuite un jsessionid identifiant de l'URL. Dans le JSP, vous pouvez utiliser le JSTL c:url pour cela. Dans le servlet, vous pouvez utiliser HttpServletResponse#encodeURL() pour cela. De cette façon, le serveur peut identifier le client en lisant la nouvelle URL de requête.

Votre nouvelle question sera probablement "Mais comment les cookies sont-ils liés à cela? Comment le serveur fait-il tout?". Eh bien, la réponse est la suivante: si le serveur reçoit une demande d'un client et que le code côté serveur (votre code) essaie d'obtenir HttpSession par HttpServletRequest#getSession() alors qu'il n'y a encore personne créé (première requête dans une nouvelle session), le serveur en créera lui-même une nouvelle. Le serveur générera un identifiant long, unique et difficile à deviner (celui que vous pouvez obtenir par HttpSession#getId() ) et définira cet ID comme valeur du cookie avec le nom jsessionid. Sous le capot, le serveur utilise pour cela HttpServletResponse#addCookie() . Enfin, le serveur stockera toutes les sessions dans une sorte de Map avec l'ID de session comme clé et la HttpSession comme valeur.

Selon la spécification de cookie HTTP , le client est tenu de renvoyer les mêmes cookies dans les en-têtes de la demande suivante. Sous le capot, le serveur recherchera le cookie jsessionid par HttpServletRequest#getCookies() et déterminera sa valeur. De cette façon, le serveur peut obtenir le HttpSession associé et le rendre à chaque appel sur HttpServletRequest#getSession().

Au point: la seule chose qui est stockée du côté client est l'ID de session (en forme de cookie) et l'objet HttpSession (y compris tous ses attributs) est stocké du côté serveur (en Java Mémoire). Vous n'avez pas à vous soucier de la gestion des sessions et vous n'avez pas non plus à vous soucier de la sécurité.

Voir également:

67
BalusC

Tous Java prennent en charge les cookies ou les ID de session encodés par URL. Ils choisiront automatiquement la bonne approche, il n'y a donc rien à faire. Demandez simplement l'objet de session à partir de votre conteneur et il gérer les détails.

[MODIFIER] Il existe deux options: les cookies et une URL spéciale. Il y a des problèmes avec les deux approches. Par exemple, si vous encodez la session dans une URL, les gens peuvent essayer de transmettre la session (en mettant l'URL dans un courrier électronique, par exemple). Si vous voulez comprendre cela, lisez quelques articles sur la sécurité et créez des serveurs d'applications. Sinon: votre Java fera la bonne chose pour vous. N'y pensez pas.

6
Aaron Digulla

Le cookie stocke juste l'ID de session, cet ID est inutile une fois la session expirée.

4
Pascal Thivent

spécification de servlet définit l'API pour accéder/définir les données de session dans l'application J2EE standard. Il définit également que les données de session sont stockées côté serveur et rien n'est transféré au client à l'exception de l'identifiant de session. Il existe 2 mécanismes de transfert de l'ID de session:

1) URL de demande, par exemple jessionid = ....
2) cookie

Le mécanisme est déterminé automatiquement en fonction des capacités du client.

[~ # ~] éditez [~ # ~] . Il n'y a pas de meilleure option, il existe une spécification de servlet qui définit le chemin.

2
Andrey Adamovich

Http est un protocole sans état côté client uniquement.

Pour implémenter une conversation avec état dessus, Java EE Web Server doit cacher certaines informations (qui est sessionid) côté client et le mécanisme qu'il peut utiliser doit suivre les spécifications HTTP et HTML.

Il existe trois façons d'atteindre cet objectif:

  1. Réécriture d'URL: le serveur ajoutera un paramètre supplémentaire à la fin du lien URL.
  2. paramètre caché dans le formulaire: le serveur ajoutera un paramètre supplémentaire à chaque formulaire en HTML.
  3. cookie: le serveur demandera au navigateur de conserver un cookie.

Fondamentalement, le serveur Web moderne aura un "filtre" pour choisir la manière d'utiliser automatiquement.
Donc, si le serveur a détecté que le navigateur désactive déjà la prise en charge des cookies, il passera à d'autres moyens.

1
Zanyking