J'ai une application web qui fonctionne très bien, mais pour laquelle j'ai besoin de déporter des traitements sur un autre serveur J2EE.
Je m'explique: l'application est développée en Struts et fait appel à une servlet (Fop) pour générer des éditions. Or pour des raisons de performances et de charge, on veut déporter la servlet Fop sur un serveur séparé, et ce de manière la plus transparente possible.
La solution envisagée est donc d'utiliser Apache en frontal avec des règles de rewrite permettant de rediriger uniquement les appels à la servlet d'édition vers le second serveur.
Jusque là tout va bien : Apache écoute sur le port 80, et redirige bien toutes les requêtes sur le port de mon serveur principal. Lors de l'appel à la servlet d'édition, la requête est bien redirigée vers le second serveur, et le document est affiché dans une popup, donc a priori pas de soucis du côté de la configuration du mod-rewrite (qui entre autre est configuré pour utiliser le mod-proxy).
Le problème survient lorsque je ferme la popup et que je fais une action dans l'application : la session n'existe plus !
J'ai bien sûr essayé de changer le contexte de la webapp de la servlet d'édition afin que celui-ci soit différent du contexte de l'application. Mais rien n'y fait.
J'ai donc affiché les headers Http des différentes requêtes et là je m'aperçoit que des choses bizarres se passent au niveau des cookies et de la session:
Durant la navigation dans l'application j'ai dans le header:
Lors de l'appel de la servlet d'édition, redirigé sur le second serveur, j'ai :Cookie: JSESSIONID=4UmPbWSgsPFdQ8-2pv:-1
Et à la première action après l'édition j'ai:Cookie: JSESSIONID=4UmPbWSgsPFdQ8-2pv:-1
...
Set-Cookie: JSESSIONID=WzyweEaoVtkImKw2vZgiiof!-1361712417; path=/
et non pas l'identifiant de session du serveur principal !!!!Cookie: JSESSIONID=WzyweEaoVtkImKw2vZgiiof!-1361712417
A quoi cela est-il dû
La session et le cookie sont bien associés à un serveur et un contexte d'application, ou juste au serveur ? Qui est censé créer la session : Apache au travers du Cookie ou le serveur d'application appelé par Apache ?
Pour info, le serveur principal est sous Websphere et le secondaire sous Weblogic, mais j'ai aussi fait le test en inversant les 2 et j'obtiens le même résultat.
J'ai en plus la contrainte de ne pas "casser" mon code, car je dois pouvoir fonctionner à la fois avec un ou deux serveurs
Jacques Desmazières
Partager