質問: JavaEE 7 + Wildfly 10 でウェブアプリケーションを作っています。 ビルドにはgradleを使っています。 互いに独立したgradleプロジェクトとして、2つのウェブアプリケーションがあり、それぞれwarファイルとしてビルドしています。 この2つのwarファイルは、単一のWildfly上にデプロイします。 現在、この2つのアプリケーション間で、セッションが共有できていません。 少なくとも、Cookieの`JSESSIONID`には異なる値が提供されています。 ゴールは、`@SessionScoped`をつけたCDI Beanのインスタンスが共有できることです。 ※2つのアプリケーションは独立してビルドされますが、同じjarを参照しています。そこに共通で使う`@RequestScoped`のクラスがあります。 ただ、制限事項があります。 このWildflyサーバ上には、別のアプリケーションも乗っています。 これに対しては、セッションは共有したくありません。 何か良い方法は無いでしょうか?
回答: 2つの独立したWARはServletContextが異なるのでオブジェクトを共有することはできません。 JSR-000369 Java Servlet 4.0 Specification: > > 7.3 Session Scope > > HttpSession objects must be scoped at the application (or servlet context) level. The underlying mechanism, such as the cookie used to establish the session, can be the same for different contexts, but the object referenced, including the attributes in that object, must never be shared between contexts by the container. > > > ServletContext API doc: > > There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as /catalog and possibly installed via a .war file.) > > > 1つめの対応として考えられるのは、それらのWARを1つのEARにまとめることです。 1つのEAR、つまり1つのweb applicationとすれば共有可能にできます。 WildFlyにおける実現方法は 別の回答で言及されている `shared-session-config` になろうかと思います。 2つめの対応として考えられるのは、(コンテナが管理してくれないのなら)自分で管理しよう、という方策です。 JBoss EAPのドキュメントで次のようなものがありましたので参考になるかもしれません: Externalize HTTP Session Data to the JBoss Data Grid: > > 3. Session Data Sharing. If you have a requirement for multiple applications to be able to share session data, this solution might be able to solve that use case as well. > > > JBoss Data Grid (JDG) は、WildFlyでは Infinispan に代替されるかと思います。