私はJava Webアプリケーションに取り組んでいます。最近、JSESSIONID cookieに依存してユーザーを識別する認証モジュールを実装しました。EclipseのローカルTomcatでテストしていましたが、すべて正常に機能しました。 ...少し高度なセットアップ構造でVPS(Centos)にアプリケーションをデプロイするまで:
ApacheHTTPサーバー
いくつかの仮想ホスト
上記のwebappは、mod_jkを使用して仮想ホストにマウントされます。現在、「sub.hostname.com/WEBAPP_NAME/home」からアクセスしていますが、「sub.hostname.com/home」で利用できるはずです。
上記の設定は、認証の更新前はそれほど大きな問題ではありませんでした(ところで、アクセスは以前はTomcatのセキュリティオプションによって処理されていました)。古いVirtualHostは次のようになり、正常に機能しました。
<VirtualHost *:80>
ServerName sub.hostname.com
RewriteEngine on
RewriteRule ^/(.+)$ /WEBAPP_NAME/$1 [L,PT]
RewriteRule ^/$ /WEBAPP_NAME/home [L,PT]
JkMount /* worker
</VirtualHost>
問題:展開後、JSESSIONID Cookieが書き込まれなかったため、認証が機能しませんでした。 RewriteRulesを削除し、「sub.hostname.com/WEBAPP_NAME/home」からアプリケーションにアクセスしました。すべてが正常に機能し、Cookieを受け取りました。これらの観察から、問題はURLが書き換えられ、サーブレットがCookieを正しいパスに書き込まないことが原因であると推測されます(?)その場合、アプリケーション内から他のパスにCookieを書き込もうとする必要があります?
これを処理できるApacheまたはTomcatで注意すべき特定の設定はありますか?または、最初に間違ったセットアップアーキテクチャを選択しましたか?
CédricCの提案を読んだ後、さらに調査を行ったところ、次のことがわかりました。 Apache、Tomcat、mod_jk、mod_rewriteを構成してTomcatをトップレベルから提供する
Kevin Loneyの指示に従って、httpヘッダーを直接変更しましたfrom Apachemod_headers モジュールを使用しました。
最終的に、VirtualHost構成に次の行を追加する必要がありました。これにより、すべてのCookieパスが_/WEBAPP_NAME
_から/ (root)
に変更されます。
_Header edit Set-Cookie "^(.*; Path=)/WEBAPP_NAME/?(.*)" $1/$2
_
代替方法-TomcatからCookieパスを変更します:
また、アプリケーションのweb.xmlでTomcatからのCookieパスを設定することもテストしました。
_<session-config>
<session-timeout>30</session-timeout>
<cookie-config>
<http-only>true</http-only>
<path>/</path> <!-- changes the path -->
<name>COOKIENAME</name>
</cookie-config>
</session-config>
_
Cookieのパスを変更するにはいくつかの選択肢があります。
ここでの問題は、ApacheconfとTomcatのrewrite_ruleがCookieパスを/ WEBAPP_NAME /に設定することです。
Tomcatでは、コンテキストの sessionCookiePath 属性を使用してCookieパスを変更できます。
戦争の名前をROOT.warに変更することで、Webアプリを/にデプロイすることもできます。
また、mod_rewriteを使用してCookieパスを変更できる可能性があります。