web-dev-qa-db-ja.com

Cookie JSESSIONID名の変更

単一の物理ボックスで複数のTomcatサーバーを実行する必要があるという要件があります。ブラウザからこれらにアクセスしているときに、ユーザーがアプリケーションを切り替えると、以前にアプリケーションにアクセスしたユーザーがログアウトされます。これは、JSESSIONID Cookieの競合が原因です。

考えられる解決策の1つは、各アプリケーションを異なるコンテキストで実行することです。残念ながら、リクエストの前にrequest.getContextPath()が追加されているリソースにはアクセスできないため、アプリケーションはコンテキストパス設定で動作しません。

このため、Cookie JSESSIONIDの名前を変更して競合を解決する必要があります。これを行う方法はありますか?はいの場合、どのように?

私の質問を明確にすることを願っています。

注:私のアプリケーションはすべて同じマシンの異なるポートで実行されています。

52
ramanr

Servlet API 3.0を使用すると、すべてがはるかに簡単になります。

Web.xmlで設定できるようになりました:

<session-config>
    <cookie-config>
        <name>MY_JSESSIONID_YAHOOOOOO</name>
    </cookie-config>
</session-config>

それでおしまい!

57
walv

以下は、context.xmlファイルのTomcat7で機能します。

<Context path="/yourApp" sessionCookieName="custom_session_id">
15
Joseph Lust

次の2つのシステムプロパティを使用すると、これを簡単に実現できます。

  • org.Apache.catalina.SESSION_COOKIE_NAME
  • org.Apache.catalina.SESSION_PARAMETER_NAME

上記のプロパティに任意の値を渡して、デフォルト値を変更できます。

ここに 完全な詳細 いくつかのサンプルスクリプトがあります。

14
user489641

Tomcat 7はこれをorg.Apache.catalina.SESSION_COOKIE_NAMEからメインの<Context>設定の属性に移動します。 http://Tomcat.Apache.org/migration-7.html#Session_manager_configuration

12
timkingman

この時点でそれが可能だとは思わない- https://issues.Apache.org/bugzilla/show_bug.cgi?id=42419 を参照

最後のエントリには、「これは5.5.xで修正され、5.5.28以降に含まれる予定です」-次のポイントリリースである-5.5.27が現在のリリースです。

4
Martin

これが機能するかどうかは100%確かではありませんが、jvmRoute属性を使用できます。これは、ロードバランサーがノードを区別できるようにするために、一般的に負荷分散/クラスター環境で使用されます。例:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">

これにより、「ABCDEF123456.node1」のようなJSESSIONID値が生成されます。

ドキュメントリンク

2
matt b