私のWebアプリは_http://localhost:8080/example.com/
_のTomcatで実行されていますが、ポート80で_http://example.com/
_を提供しているApacheから逆プロキシされています。私のWebアプリはrequest.getHeader("x-forwarded-Host")
ヘッダーを見て知るリバースプロキシの背後にあること。これを(動的に)検出すると、サーブレットパスなしでURLを構築します。
これは、JSESSIONID Cookieを除くすべてに対して正常に機能します。リバースプロキシ経由でアクセスすると、_/example.com
_ではなく_/
_のパスで設定されます。リクエストに_x-forwarded-Host
_ヘッダーがある場合、コードがどのようにしてTomcatにそのCookieのパスをオーバーライドするよう指示することができるかわかりません。
WebアプリからJSESSIONID Cookieを自分で設定しようとしましたが、2つのSet-Cookieヘッダーになりますが、そのうちの1つだけが正しいです。
Tomcat6はServlet 2.3仕様を使用します。コードまたはTomcatの構成によるCookieパスの変更はサポートしていません。
Apache側からいくつかのmod_proxy
ディレクティブ。 ProxyPassReverseCookiePath
ディレクティブは、まさに私が望むことをします。不正なパスを持つTomcatからCookieを取得し、正しいパスに書き換えます。
<VirtualHost *:*>
Servername example.com
ProxyRequests Off
ProxyPass / http://localhost:8080/example.com/
ProxyPassReverseCookiePath /example.com /
ProxyPassReverseCookieDomain localhost example.com
</VirtualHost>
または、ノード/ Contextの属性sessionCookiePathを「/」に設定します(ファイル:/conf/context.xml):
<Context sessionCookiePath="/">
ご覧ください: http://Tomcat.Apache.org/Tomcat-7.0-doc/config/context.html 詳細については
サーブレット仕様のバージョン3.0では、セッションCookieを制御する機能が導入されました。 http://docs.Oracle.com/javaee/6/api/javax/servlet/ServletContext.html#getSessionCookieConfig()
SessionCookieConfig scc = getServletContext().getSessionCookieConfig();
scc.setPath("/");
scc.setDomain("example.com");
Tomcat 7は、サーブレット仕様のバージョン3を使用します。