[Java] Tomcatのさまざまなアプリケーション間でセッション状態を共有する方法はありますか?


Answers

注意すべきことは、2つのWebアプリケーションが異なるクラスローダーを使用することです。 オブジェクトを共有したい場合は、同じクラスローダーの同じバージョンのクラスを使用する必要があります(そうしないとLinkageErrorsが発生します)。 つまり、両方のWebアプリケーション(システムクラスパスなど)で共有されているクラスローダーに入れたり、直列化を使用して正しいクラスローダーのオブジェクトを正しいバージョンのクラスで効果的に排除して再構成したりすることです。

Question

あるアプリケーションを他のアプリケーションに影響を与えずに更新できるように、2つの異なる.warファイルで作業アプリケーションを分割したいとします。 各Webアプリケーションには、異なるUI、異なるユーザー、異なる展開スケジュールがあります。

一番簡単なパスは同じセッションを共有しているようですので、 session.setAttribute("foo", "bar") set session.setAttribute("foo", "bar")アプリケーションBがそれを見ることができます。

同じTomcatインスタンス内の両方のアプリケーションのHttpSession状態を共有する方法はありますか?

私たちのアプリは専用のTomcat 5.5上で動作しています。同じTomcatインスタンス上で実行されている他のアプリケーションはありませんので、セッション共有に関するセキュリティ上の問題は問題になりません。 複数のTomcatインスタンスを実行していますが、バランサは固定セッションを使用しています。

それが不可能な場合や、このセッション共有が本当に悪い考えである場合は、コメントを残してください。




あなたは、コンテキストルートによってサーブレットコンテキストを取ることによって行うことができます。

変数を検索する。

request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute(variableName)

変数を設定する場合:

request.getSession().getServletContext().getContext("/{applicationContextRoot}").setAttribute(variableName,variableValue)

注:両方のアプリケーションを同じサーバーに配置する必要があります。

あなたが何か問題を見つけたら、私に教えてください。




高可用性を確保して順番にアプリを分割しないでください。 多くのTomcatインスタンスにアプリ全体をデプロイできます。