web-dev-qa-db-fra.com

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

Quand/quelles sont les conditions dans lesquelles une JSESSIONID est créée?

Est-ce par domaine? Par exemple, si j'ai un serveur d'applications Tomcat et que je déploie plusieurs applications Web, un JSESSIONID différent sera-t-il créé par contexte (application Web), ou est-il partagé entre plusieurs applications Web à condition qu'il s'agisse du même domaine ?

259
joshjdevl

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 juste obtenir la session, mais pas la créer si elle n'existe pas, utilisez request.getSession(false) - cela vous retournera une session ou null. Dans ce cas, la nouvelle session n'est pas 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:

SRV.7.3 Portée de la session

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 directive session='false' page, auquel cas la variable de session n'est pas du tout disponible sur la page JSP.

303
Peter Štibraný

Voici quelques informations sur une autre source du cookie JSESSIONID:

Je ne faisais que déboguer du code Java exécuté sur un serveur Tomcat. Je n'appelais pas request.getSession() explicitement à un endroit de mon code, mais j'ai remarqué qu'un cookie JSESSIONID était toujours en cours de création.

J'ai finalement examiné le code généré par Java correspondant à un fichier JSP dans le répertoire de travail de Tomcat.

Il semble que, que cela vous plaise ou non, si vous appelez un fichier JSP à partir d'un servlet, JSESSIONID sera créé!

Ajoutée: J'ai trouvé cela en ajoutant la directive JSP suivante:

<%@ page session="false" %>

vous pouvez désactiver le réglage de JSESSIONID avec un fichier JSP.

45
Rangachari Anand

CORRECTION: Merci de 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 . Là, vous trouverez la phrase suivante

Les informations de session ne concernent que l'application Web actuelle (ServletContext). Par conséquent, les informations stockées dans un contexte ne seront pas directement visibles dans un autre.

Ainsi, lorsque vous accédez au site pour la première fois, 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. lors du passage de http à https (après la connexion), il est très judicieux de créer une nouvelle session.

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

21
Mo.

Faites attention si votre page inclut d'autres fichiers .jsp ou .jspf (fragment)! Si vous ne définissez pas

<%@ page session="false" %>

sur eux aussi, la page parent va commencer une nouvelle session et définir le cookie JSESSIONID.

Pour les pages .jspf en particulier, cela se produit si vous avez configuré votre fichier 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 d'eux.

7
polaretto

Pour les liens générés dans une JSP avec des balises personnalisées, je devais utiliser

<%@ page session="false" %>

dans le JSP

ET

request.getSession().invalidate();

dans l'action Struts

1
Jerome Jaglale