Un moyen de partager l’état de session entre différentes applications dans tomcat?

Nous voulons diviser une application en deux fichiers .war différents afin de pouvoir mettre à jour une application sans affecter l’autre. Chaque application Web aura une interface utilisateur différente, des utilisateurs différents et un calendrier de déploiement différent.

Le chemin le plus simple semble partager la même session, de sorte que si l’application A set session.setAtsortingbute("foo", "bar") B pourra le voir.

Est-il possible de partager l’état HttpSession pour les deux applications de la même instance Tomcat?

Notre application s’exécute sur un Tomcat 5.5 dédié, il n’y a pas d’autres applications s’exécutant sur la même instance de tomcat, donc les problèmes de sécurité liés au partage de session ne posent aucun problème. Nous exécutons plusieurs instances Tomcat, mais l’équilibreur utilise des sessions persistantes.

Si ce n’est pas possible ou si le partage de session est une très mauvaise idée, laissez un commentaire.

Vous ne devez pas partager HttpSession; mais vous pouvez partager d’autres objects. Par exemple, vous pouvez enregistrer un object via JNDI et accéder au même object dans toutes vos applications (les bases de données l’utilisent pour regrouper les connexions).

Une chose à savoir est que deux applications Web utiliseront des chargeurs de classes différents. Si vous souhaitez partager des objects, ils doivent utiliser la même version de la classe à partir du même chargeur de classes (sinon vous obtiendrez LinkageErrors). Cela signifie soit les placer dans un chargeur de classe partagé par les deux applications Web (chemin de classe système par exemple), soit utiliser la sérialisation pour drainer et reconstituer efficacement l’object dans le chargeur de classes approprié avec la version correcte de la classe.

Si les applications Web sont si étroitement couplées qu’elles doivent partager des objects, pourquoi les divisez-vous en deux? Même si vous les gérez de manière quelque peu indépendante, tout système de gestion de build décent doit pouvoir créer un seul fichier WAR pour le déploiement.

Une solution comme celle proposée par Aaron avec JNDI fonctionnera, mais uniquement si les deux applications Web sont exécutées sur le même serveur. Si les unités sont étroitement couplées et que vous allez de toute façon l’exécuter sur le même serveur … autant qu’un seul WAR

Si vous voulez vraiment qu’ils soient indépendants, j’examinerai sérieusement l’échange de données entre les deux. Idéalement, vous voudriez qu’ils ne partagent que des données pertinentes. Ces données peuvent être échangées via des parameters POST (ou GET si plus appropriés), vous pouvez même envisager d’utiliser des cookies.

Si vous voulez utiliser Spring, il y a un projet appelé Spring Session : https://github.com/spring-projects/spring-session

Citant: “HttpSession – permet de remplacer la session HttpSession dans un conteneur d’application (c.-à-d. Tomcat) de manière neutre”

Une manière de le faire est décrite dans cet article: Partage de session dans Apache Tomcat

Résumé: Ajouter emptySessionPath à la configuration du connecteur et crossContext au contexte

Vous pouvez le faire en prenant le contexte de servlet par votre racine de contexte.

Pour récupérer une variable.

 request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAtsortingbute(variableName) 

Pour définir la variable:

 request.getSession().getServletContext().getContext("/{applicationContextRoot}").setAtsortingbute(variableName,variableValue) 

Remarque: Les deux applications doivent être déployées sur le même serveur.

Pls laissez-moi savoir si vous trouvez un problème

Tomcat 8: je devais le faire: dans conf / context.xml

plus de détails sur les atsortingbuts de configuration ici

et ensuite pour définir la valeur (comme la réponse de @ Qazi):

 ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath") servletContext.setAtsortingbute(variableName,variableValue) 

pour obtenir la valeur:

 ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath") servletContext.getAtsortingbute("user"); 

J’ai développé le serveur d’état de session pour Tomcat en utilisant Python.

Pour cette raison, je n’ai pas besoin de changer le code déjà écrit pour créer / accéder à une session et la détruire. En outre, comme il existe un serveur / service distinct qui gère et stocke les sessions, le cluster principal n’est pas nécessaire. Il n’y a pas de réplication de session (comme dans le clustering Tomcat) dans ce cas, il s’agit plutôt d’un partage de session entre une agriculture Web.

Vous ne devez pas diviser votre application de cette façon pour avoir une haute disponibilité. Vous pouvez déployer l’ensemble de l’application sur de nombreuses instances tomcat.