web-dev-qa-db-fra.com

Comment définir correctement le chemin du cookie JSESSIONID derrière le proxy inverse

Mon application Web s'exécute dans Tomcat à http://localhost:8080/example.com/ Mais elle est en cours de proxy inverse depuis Apache qui sert http://example.com/ Sur le port 80. Mon application Web regarde l'en-tête request.getHeader("x-forwarded-Host") de savoir qu'il se cache derrière un proxy inverse. Lorsqu'il le détecte (dynamiquement), il crée des URL sans le chemin du servlet sur elles.

Cela fonctionne très bien pour tout sauf pour le cookie JSESSIONID. Il est défini avec un chemin d'accès de /example.com Au lieu de / Lorsqu'il est accessible via le proxy inverse. Je ne peux pas comprendre comment mon code peut demander à Tomcat de remplacer le chemin de ce cookie lorsqu'il y a un en-tête x-forwarded-Host Sur la demande.

J'ai moi-même essayé de définir le cookie JSESSIONID à partir de l'application Web, mais cela ne fait que générer deux en-têtes Set-Cookie, dont un seul est correct.

24
Stephen Ostermiller

Tomcat6 utilise la spécification Servlet 2.3. Il ne prend pas en charge la modification du chemin du cookie via le code ou la configuration Tomcat.

Je l'ai fait fonctionner du côté Apache avec quelques mod_proxy directives. La directive ProxyPassReverseCookiePath fait exactement ce que je veux. Il prend le cookie de Tomcat avec le chemin incorrect et le réécrit dans le chemin correct.

<VirtualHost *:*>
    Servername example.com
    ProxyRequests Off
    ProxyPass / http://localhost:8080/example.com/
    ProxyPassReverseCookiePath /example.com /
    ProxyPassReverseCookieDomain localhost example.com
</VirtualHost>
34
Stephen Ostermiller

Vous pouvez également définir l'attribut sessionCookiePath du nœud/Context (fichier: /conf/context.xml) sur "/":

<Context sessionCookiePath="/">

Jetez un œil à: http://Tomcat.Apache.org/Tomcat-7.0-doc/config/context.html pour plus d'informations

6
drumn82

La version 3.0 de la spécification Servlet a 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 Servlet.

5
Stephen Ostermiller