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.
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>
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
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.