1

根据下面的 SO 帖子,我正在尝试在两个应用程序上下文之间共享会话(在同一个 Tomcat 实例上)。

在 Tomcat 中的上下文之间共享会话数据

我创建了两个如下所示的 webapp 来测试它。(每个 webapp 只包含一个 servlet 和一个 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请求,第二个请求需要打印“hello”,但第二个请求总是打印“session is null”

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

有人可以指出这里有什么问题吗?(我的 web.xml 是 3.0 版)

我正在开发一种社交网络类型的 webapp。我计划将 UI 部分创建为一个 webapp,将后端创建为一个 RESTful 服务 webapp,并计划将两个 webapps 部署到同一个 tomcat 实例。有人可以建议这是一种正确的方法吗?

4

2 回答 2

2

会话不会在 Web 应用程序之间共享,尽管会话 ID 可能取决于配置。当 ID 被共享时,会话会以正常方式在每个 Web 应用程序中创建,但它们将共享一个公共 ID。

于 2013-10-24T20:16:26.850 回答
0

对于 Tomcat 8(也可能适用于 Tomcat 7),我使用以下配置在 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>

我两次部署相同的简单 webapp log.warlog2.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

大多数示例/解决方案使用需要更多设置工作的内存数据库:

于 2019-04-26T16:58:41.130 回答