Dans quelles conditions un JSESSIONID est-il créé?

276

Quand / quelles sont les conditions de création d'un JSESSIONID?

Est-ce par domaine? Par exemple, si j'ai un serveur d'applications Tomcat et que je déploie plusieurs applications Web, un autre JSESSIONIDsera-t-il créé par contexte (application Web), ou est-il partagé entre les applications Web tant qu'il s'agit du même domaine?

joshjdevl
la source

Réponses:

324

Le cookie JSESSIONID est créé / envoyé lors de la création de la session. La session est créée lorsque votre code appelle request.getSession()ou request.getSession(true)pour la première fois. Si vous voulez simplement obtenir la session, mais pas la créer si elle n'existe pas, utilisez request.getSession(false)- cela vous renverra une session ou null. Dans ce cas, aucune nouvelle session n'est créée et le cookie JSESSIONID n'est pas envoyé. (Cela signifie également que la session n'est pas nécessairement créée à la première demande ... vous et votre code êtes en contrôle lorsque la session est créée)

Les sessions sont par contexte:

Portée de la session SRV.7.3

Les objets HttpSession doivent être étendus au niveau de l'application (ou du contexte de servlet). Le mécanisme sous-jacent, tel que le cookie utilisé pour établir la session, peut être le même pour différents contextes, mais l'objet référencé, y compris les attributs de cet objet, ne doit jamais être partagé entre les contextes par le conteneur.

( Spécification Servlet 2.4 )

Mise à jour: chaque appel à la page JSP crée implicitement une nouvelle session s'il n'y a pas encore de session. Cela peut être désactivé avec la session='false'directive page, auquel cas la variable de session n'est pas du tout disponible sur la page JSP.

Peter Štibraný
la source
2
Impossible de créer une session sans appel explicite à getSession? en ce qui concerne "ne doit jamais être partagé entre les contextes par le conteneur", websphere a une option pour partager des sessions, ce qui est la motivation de la question :)
joshjdevl
Pas si vous utilisez uniquement l'API Servlet. Il peut cependant y avoir des extensions spécifiques au serveur (comme le partage de session de Websphere comme vous le signalez).
Peter Štibraný
Je crois que votre fichier context.xml peut contrôler la création automatique de session si votre balise <Context> contient un attribut cookies, par exemple <Context cookies = "false">
BT
En ce moment, j'obtiens de nombreux hits sur mon filtre pour créer une session et il semble que ce ne soit qu'après la création du deuxième hit (pas une deuxième actualisation de page), cela a appelé mon attention "la session n'est pas nécessairement créée à la première demande .." est c'est lié? pourriez-vous donner un exemple pourquoi cela n'est pas nécessairement créé à la première demande? Merci!
jpganz18
@ jpganz18: Si vous appelez simplement request.getSession()ou request.getSession(true), vous obtenez une session existante ou nouvelle. Cependant, si votre code appelle request.getSession(false), vous obtenez la session existante ou null, si aucune session n'existe.
Peter Štibraný
49

Voici quelques informations sur une autre source du JSESSIONIDcookie:

Je déboguais juste du code Java qui s'exécute sur un serveur tomcat. Je n'appelais pas request.getSession()explicitement n'importe où dans mon code mais j'ai remarqué qu'un JSESSIONIDcookie était toujours en cours de création.

J'ai finalement jeté un œil au code Java généré correspondant à un JSP dans le répertoire de travail sous Tomcat.

Il semble que, que cela vous plaise ou non, si vous invoquez un JSP à partir d'un servlet, il JSESSIONIDsera créé!

Ajouté: Je viens de découvrir cela en ajoutant la directive JSP suivante:

<%@ page session="false" %>

vous pouvez désactiver le réglage de JSESSIONIDpar un JSP.

Rangachari Anand
la source
3
En d'autres termes: la valeur par défaut de l'attribut de session de page est "true". Ce qui pourrait être inattendu dans certains (nombreux?) Cas.
David Balažic
Je suis également sur tomcat, et je n'utilise pas du tout jsp, mais le cookie de session est quand même créé. Une idée comment l'empêcher dans cette situation?
ClassyPimp
23

CORRECTION: Veuillez voter pour la réponse de Peter Štibraný - elle est plus correcte et complète!

Un "JSESSIONID" est l'identifiant unique de la session http - voir le javadoc ici . Vous y trouverez la phrase suivante

Les informations de session sont limitées à l'application Web actuelle (ServletContext), de sorte que les informations stockées dans un contexte ne seront pas directement visibles dans un autre.

Ainsi, lorsque vous accédez pour la première fois à un site, une nouvelle session est créée et liée au SevletContext. Si vous déployez plusieurs applications, la session n'est pas partagée.

Vous pouvez également invalider la session en cours et donc en créer une nouvelle. Par exemple, lorsque vous passez de http à https (après la connexion), c'est une très bonne idée de créer une nouvelle session.

J'espère que ça répond à ta question.

Mo.
la source
1
Explication claire de la portée de la session.
user3123690
@Mo le lien est rompu
Timofey
8

Attention si votre page contient d'autres .jsp ou .jspf (fragment)! Si vous ne définissez pas

<%@ page session="false" %>

sur eux également, la page parent finira par démarrer une nouvelle session et définir le cookie JSESSIONID.

Pour les pages .jspf en particulier, cela se produit si vous avez configuré votre web.xml avec un tel extrait:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

afin d'activer les scriptlets à l'intérieur.

polaretto
la source
Voulez-vous dire définir page session = false dans tous les fragments inclus (.jsp et .jspf) et ne pas l'inclure dans le jsp principal qui inclut le reste des extraits?
Ommadawn
2

Pour les liens générés dans une JSP avec des balises personnalisées, j'ai dû utiliser

<%@ page session="false" %>

dans le JSP

ET

request.getSession().invalidate();

dans l'action Struts

Jerome Jaglale
la source