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.

24
demandé sur Stephen Ostermiller 2012-02-28 21:12:04

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>
32
répondu Stephen Ostermiller 2015-01-20 20:57:34

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

6
répondu drumn82 2013-09-24 15:44:30

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.

5
répondu Stephen Ostermiller 2013-12-12 13:34:57