Partage de données de session entre contextes dans Tomcat
j'ai cherché des solutions pour partager des données de session entre des fichiers de guerre de plusieurs fichiers. Je suis tombé sur la solution suivante http://www.fwd.at/tomcat/sharing-session-data-howto.html
l'idée de base est que si vous avez plus d'un fichier de guerre, vous pouvez définir un cookie en utilisant le sessionid du premier contexte utilisé.
le cookie peut être défini en utilisant un chemin qui s'appliquera à tous les contextes/applications.
Par exemple, si je avoir la configuration suivante pour 3 applicatons
/myapp/app1
/myapp/app2
/myapp/app3
je peux définir un cookie comme suit
/ myapp sessionid.
le cookie sessionid sera alors envoyé à n'importe quelle requête avec /myapp dans l'adresse. Cela permet à l'id de session d'être utilisé par n'importe lequel des contextes.
le seul problème avec cette approche est qu'elle a été écrite en 2003 et testée sur Tomcat 4.
Quel est votre opinion de cette approche? Est-il mieux moyen de le faire?
Merci
3 réponses
cet article est en effet fortement dépassé.
sur Tomcat 5.5 et 6.0 vous pouvez simplement définir emptySessionPath
l'attribut true
dans le <Connector>
élément /conf/server.xml
.
<Connector ... emptySessionPath="true">
sur Tomcat 7.0 ceci a changé car il est maintenant configurable à partir de L'API Servlet 3.0. Il est alors du côté de Tomcat configurable en définissant sessionCookiePath
/
<Context>
élément dans tout responsable context.xml
fichier.
<Context ... sessionCookiePath="/">
comme dit, il y a une nouvelle API Servlet 3.0 ce qui vous permet de configurer le cookie de session à l'aide de l'API standard. Vous pouvez le faire de façon déclarative par adjonction, à la web.xml
:
<session-config>
<cookie-config>
<path>/</path>
</cookie-config>
</session-config>
ou par SessionCookieConfig
qui est disponible par ServletContext#getSessionCookieConfig()
.
getServletContext().getSessionCookieConfig().setPath("/");
Vous pouvez faire cela ServletContextListener#contextInitialized()
ou HttpServlet#init()
.
Voir aussi:
- Tomcat 5.5 connecteur HTTP documentation
- Tomcat 6.0 documentation du connecteur HTTP - mentionne un trou de sécurité potentiel
- Tomcat 7.0 documentation de contexte
à ma connaissance, il n'y a pas de moyen direct pour faire cela, vous pouvez cependant utiliser un cookie de domaine si ces contextes partagent le même domaine.
Vous pouvez soit mettre les données dans le cookie (je ne le recommande pas).
ou mettez un Id de session sécurisé que vous pouvez utiliser pour accéder à une forme de stockage (DB ou cache distribué, etc.) pour récupérer les données dont vous avez besoin.
si la quantité de données n'est pas astronomique et que les données elles-mêmes ne changent pas trop rapidement, vous pourriez envisager D'utiliser JNDI. Cette solution a été conçue exactement ce que vous cherchez.
Vous pouvez avoir un coup d'oeil à documents officiels ou ce post pour tomcat-user mailing list pour les références et exemples.