複数の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でテストされたことです。
このアプローチについてどう思いますか?それを行うより良い方法はありますか?
ありがとう
その記事は確かにかなり古くなっています。
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>
_
またはプログラムによって SessionCookieConfig
ServletContext#getSessionCookieConfig()
で使用できます。
_getServletContext().getSessionCookieConfig().setPath("/");
_
ServletContextListener#contextInitialized()
または HttpServlet#init()
でこれを行うことができます。
私の知る限り、これを行う直接的な方法はありませんが、これらのコンテキストが同じドメインを共有している場合は、ドメインレベルのCookieを使用できます。
データをcookieに入れることもできます(お勧めしません)。
または、何らかの形式のストレージ(DBまたは分散キャッシュなど)にアクセスして必要なデータを取得するために使用できる保護されたセッションIDを配置します。
データの量が天文学的ではなく、データ自体があまり急速に変化していない場合は、JNDIの使用を検討してください。このソリューションは、まさにあなたが探しているもののために設計されました。
リファレンスと例については、 公式ドキュメント または Tomcat-userメーリングリストへのこの投稿 をご覧ください。
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.warとlog2.war :
/log
/log2
これで/log
にログインし、/log2
にユーザーを表示させることができます。これはTomcatのデフォルト設定では機能しません。
セッション値が設定され、読み取られます。
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
ほとんどの例/ソリューションは、より多くのセットアップ作業を必要とするインメモリデータベースを使用しています。