Comment définir correctement le chemin du cookie JSESSIONID derrière le proxy inverse
Mon application web est en cours D'exécution dans Tomcat à http://localhost:8080/example.com/
mais elle est en cours de proxy inverse à partir D'Apache qui sert http://example.com/
sur le port 80. Mon application web regarde l'en-tête request.getHeader("x-forwarded-host")
pour savoir qu'il se trouve derrière un proxy inverse. Quand il détecte cela (dynamiquement), il construit des URL sans le chemin de servlet sur eux.
Cela fonctionne bien pour tout sauf pour le cookie JSESSIONID. Il est défini avec un chemin de /example.com
au lieu de /
lorsqu'il est accessible via le proxy inverse. Je ne peux pas comprendre comment je mon code peut dire à Tomcat de remplacer le chemin de ce cookie lorsqu'il y a un en-tête x-forwarded-host
sur la requête.
J'ai essayé de définir le cookie JSESSIONID à partir de l'application web moi-même, mais cela se traduit par deux en-têtes Set-Cookie, dont un seul est correct.
3 réponses
Tomcat6 utilise la spécification Servlet 2.3. Il ne prend pas en charge la modification du chemin du cookie soit par le code ou la configuration Tomcat.
Je l'ai fait fonctionner du côté Apache avec quelques directives mod_proxy
. La directive ProxyPassReverseCookiePath
fait exactement ce que je veux. Il prend le cookie de Tomcat avec le chemin incorrect et le réécrit sur le chemin correct.
<VirtualHost *:*>
Servername example.com
ProxyRequests Off
ProxyPass / http://localhost:8080/example.com/
ProxyPassReverseCookiePath /example.com /
ProxyPassReverseCookieDomain localhost example.com
</VirtualHost>
Vous pouvez également définir l'attribut sessionCookiePath du noeud / Context (file: / conf / context.xml) à "/":
<Context sessionCookiePath="/">
Jetez un oeil à: http://tomcat.apache.org/tomcat-7.0-doc/config/context.html pour plus d'informations
La version 3.0 de la spécification de Servlet introduit une fonctionnalité pour contrôler le cookie de session: http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#getSessionCookieConfig()
SessionCookieConfig scc = getServletContext().getSessionCookieConfig();
scc.setPath("/");
scc.setDomain("example.com");
Tomcat 7 utilise la version 3 de la spécification de Servlet.