web-dev-qa-db-ja.com

Tomcatのコンテキスト間でセッションデータを共有する

複数のwarファイル間でセッションデータを共有するためのソリューションを探しています。私は次の解決策に出くわしました http://www.fwd.at/Tomcat/sharing-session-data-howto.html

基本的な考え方は、複数のwarファイルがある場合、使用される最初のコンテキストのセッションIDを使用してCookieを設定できるということです。

Cookieは、すべてのコンテキスト/アプリケーションに適用されるパスを使用して設定できます。

たとえば、次の3つのアプリケーションの構成があるとします。

/myapp/app1
/myapp/app2
/myapp/app3

次のようにクッキーを設定できます

/ myappセッションID。

その後、セッションID Cookieは、アドレスに/ myappを含むすべてのリクエストに送信されます。これにより、セッションIDを任意のコンテキストで使用できるようになります。

このアプローチの唯一の問題は、2003年に作成され、Tomcat 4でテストされたことです。

このアプローチについてどう思いますか?それを行うより良い方法はありますか?

ありがとう

24
ziggy

その記事は確かにかなり古くなっています。

Tomcat 5.5および6.0では、_<Connector>_の_/conf/server.xml_要素でemptySessionPath属性をtrueに設定するだけです。

_<Connector ... emptySessionPath="true">
_

Tomcat 7.0では、サーブレット3.0 APIから設定できるようになったため、これが変更されました。その後、責任ある_/_ファイルの_<Context>_要素でsessionCookiePathを_context.xml_に設定することにより、Tomcat側で構成できます。

_<Context ... sessionCookiePath="/">
_

すでに述べたように、標準のAPIを介してセッションCookieを構成できる新しいサーブレット3.0 APIがあります。 _web.xml_に以下を追加することで、宣言的に行うことができます。

_<session-config>
    <cookie-config>
        <path>/</path>
    </cookie-config>
</session-config>
_

またはプログラムによって SessionCookieConfigServletContext#getSessionCookieConfig() で使用できます。

_getServletContext().getSessionCookieConfig().setPath("/");
_

ServletContextListener#contextInitialized() または HttpServlet#init() でこれを行うことができます。

以下も参照してください。

43
BalusC

私の知る限り、これを行う直接的な方法はありませんが、これらのコンテキストが同じドメインを共有している場合は、ドメインレベルのCookieを使用できます。

データをcookieに入れることもできます(お勧めしません)。

または、何らかの形式のストレージ(DBまたは分散キャッシュなど)にアクセスして必要なデータを取得するために使用できる保護されたセッションIDを配置します。

2
MahdeTo

データの量が天文学的ではなく、データ自体があまり急速に変化していない場合は、JNDIの使用を検討してください。このソリューションは、まさにあなたが探しているもののために設計されました。

リファレンスと例については、 公式ドキュメント または Tomcat-userメーリングリストへのこの投稿 をご覧ください。

1
mindas

Tomcat 8の場合、次の構成を使用して2つのWebアプリケーション間でセッションを共有します。

conf/context.xml

<Context sessionCookiePath="/">

    <Valve className="org.Apache.catalina.valves.PersistentValve"/>
    <Manager className="org.Apache.catalina.session.PersistentManager">
        <Store className="org.Apache.catalina.session.FileStore" directory="${catalina.base}/temp/sessions"/>
    </Manager>

    ...

</Context>

同じシンプルなウェブアプリを2回デプロイしますlog.warlog2.war

/log
/log2

これで/logにログインし、/log2にユーザーを表示させることができます。これはTomcatのデフォルト設定では機能しません。

enter image description here

セッション値が設定され、読み取られます。

HttpSession session=request.getSession();  
session.setAttribute("name",name);

HttpSession session=request.getSession(false);  
String name=(String)session.getAttribute("name");  

私はこのプロジェクトを例として使用しました: https://www.javatpoint.com/servlet-http-session-login-and-logout-example

ほとんどの例/ソリューションは、より多くのセットアップ作業を必要とするインメモリデータベースを使用しています。

1
flavio.donze