単一の物理ボックスで複数のTomcatサーバーを実行する必要があるという要件があります。ブラウザからこれらにアクセスしているときに、ユーザーがアプリケーションを切り替えると、以前にアプリケーションにアクセスしたユーザーがログアウトされます。これは、JSESSIONID Cookieの競合が原因です。
考えられる解決策の1つは、各アプリケーションを異なるコンテキストで実行することです。残念ながら、リクエストの前にrequest.getContextPath()が追加されているリソースにはアクセスできないため、アプリケーションはコンテキストパス設定で動作しません。
このため、Cookie JSESSIONIDの名前を変更して競合を解決する必要があります。これを行う方法はありますか?はいの場合、どのように?
私の質問を明確にすることを願っています。
注:私のアプリケーションはすべて同じマシンの異なるポートで実行されています。
Servlet API 3.0を使用すると、すべてがはるかに簡単になります。
Web.xmlで設定できるようになりました:
<session-config>
<cookie-config>
<name>MY_JSESSIONID_YAHOOOOOO</name>
</cookie-config>
</session-config>
それでおしまい!
以下は、context.xmlファイルのTomcat7で機能します。
<Context path="/yourApp" sessionCookieName="custom_session_id">
次の2つのシステムプロパティを使用すると、これを簡単に実現できます。
上記のプロパティに任意の値を渡して、デフォルト値を変更できます。
ここに 完全な詳細 いくつかのサンプルスクリプトがあります。
Tomcat 7はこれをorg.Apache.catalina.SESSION_COOKIE_NAMEからメインの<Context>設定の属性に移動します。 http://Tomcat.Apache.org/migration-7.html#Session_manager_configuration
この時点でそれが可能だとは思わない- https://issues.Apache.org/bugzilla/show_bug.cgi?id=42419 を参照
最後のエントリには、「これは5.5.xで修正され、5.5.28以降に含まれる予定です」-次のポイントリリースである-5.5.27が現在のリリースです。
これが機能するかどうかは100%確かではありませんが、jvmRoute
属性を使用できます。これは、ロードバランサーがノードを区別できるようにするために、一般的に負荷分散/クラスター環境で使用されます。例:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
これにより、「ABCDEF123456.node1」のようなJSESSIONID値が生成されます。