web-dev-qa-db-ja.com

Tomcatを使用したApachehttpd mod_rewriteにより、JSESSIONIDが失われます

私は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で注意すべき特定の設定はありますか?または、最初に間違ったセットアップアーキテクチャを選択しましたか?

1
sldk

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

https://stackoverflow.com/questions/12755499/how-to-change-jsessionid-cookie-path-to-server-root-in-spring-app-)の質問からweb.xmlの例を取得しましたon-jetty

0
sldk

Cookieのパスを変更するにはいくつかの選択肢があります。

ここでの問題は、ApacheconfとTomcatのrewrite_ruleがCookieパスを/ WEBAPP_NAME /に設定することです。

Tomcatでは、コンテキストの sessionCookiePath 属性を使用してCookieパスを変更できます。

戦争の名前をROOT.warに変更することで、Webアプリを/にデプロイすることもできます。

また、mod_rewriteを使用してCookieパスを変更できる可能性があります。

0