1

以下の SO 投稿に基づいて、(同じ Tomcat インスタンス上の) 2 つのアプリケーション コンテキスト間でセッションを共有しようとしています。

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

これをテストするために、次のような 2 つの Web アプリケーションを作成しました。(各 webapp には、サーブレットと web.xml のみが含まれます)

WebApp-1 サーブレット

public class App1Servlet extends HttpServlet
{
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession(true);
        session.setAttribute("message", "hello");
        try{
            response.getOutputStream().print("session value set");
        }catch(Exception e){}
    }
}

Webapp-1 web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>app1</display-name>

  <servlet>
    <servlet-name>app1servlet</servlet-name>
    <servlet-class>session.test.App1Servlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>app1servlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <session-config>
    <cookie-config>
        <name>APPSESSIONID</name>
        <path>/</path>
    </cookie-config>
  </session-config>

</web-app>

WebApp-2 サーブレット

public class App2Servlet extends HttpServlet
{
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession(false);

        try{
            if(session != null){
                response.getOutputStream().print(""+session.getAttribute("message"));
            } else {
                response.getOutputStream().print("session is null");
            }
        }catch(Exception e){}
    }
}

Webapp-2 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>app2</display-name>

  <servlet>
    <servlet-name>app2servlet</servlet-name>
    <servlet-class>session.test.App2Servlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>app2servlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <session-config>
    <cookie-config>
        <name>APPSESSIONID</name>
        <path>/</path>
    </cookie-config>
  </session-config>
</web-app>

次の http リクエストを次々に発行すると、2 番目のリクエストは「hello」を出力する必要がありますが、2 番目のリクエストは常に「session is null」を出力します。

http://localhost/app1
http://localhost/app2

誰かがここで何が間違っているか指摘できますか? (私の web.xml はバージョン 3.0 です)

私はソーシャルネットワーキングのような webapp を開発しています。UI 部分を 1 つの webapp として作成し、バックエンドを安らかなサービス webapp として作成し、両方の webapp を同じ tomcat インスタンスにデプロイすることを計画しています。これが正しいアプローチであると誰かが提案できますか?

4

2 に答える 2