web-dev-qa-db-ja.com

JSESSIONID Cookieパスをリバースプロキシの背後に適切に設定する方法

私の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つだけが正しいです。

24

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

または、ノード/ Contextの属性sessionCookiePathを「/」に設定します(ファイル:/conf/context.xml):

<Context sessionCookiePath="/">

ご覧ください: http://Tomcat.Apache.org/Tomcat-7.0-doc/config/context.html 詳細については

6
drumn82

サーブレット仕様のバージョン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を使用します。

5