java - 上下文之间的 session 共享在 Tomcat 7 上不起作用

标签 java session servlets tomcat7 session-cookies

基于下面的SO帖子,我试图在两个应用程序上下文之间(在同一个Tomcat实例上)共享 session 。

Sharing session data between contexts in Tomcat

我创建了两个如下所示的网络应用程序来测试这一点。 (每个webapp只包含一个servlet和一个web.xml)

WebApp-1 Servlet

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 Servlet

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)

我正在开发一种社交网络类型的网络应用程序。我计划将 UI 部分创建为一个 Web 应用程序,将后端创建为一个静态服务 Web 应用程序,并计划将这两个 Web 应用程序部署到同一个 Tomcat 实例。有人能建议这是正确的方法吗?

最佳答案

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

关于java - 上下文之间的 session 共享在 Tomcat 7 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19571325/

相关文章:

java - 使用 mvvm 时将业务逻辑放在哪里

java - 无法创建 SOAP 连接工厂 : Provider com. sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory 未找到

c# - .NET Web 浏览器控件和 Dispose()

python - CherryPy 与 Postgresql session

Java EE Servlet eclipse tomcat HTTP Error 500 Servlet执行抛出异常

maven - 如何使用可嵌入的tomcat访问maven项目结构中的tomcat servlet

java - Firebase Cloud Firestore - 将文档获取到自定义对象并将其传递给另一个 Activity

java - 为什么复制对象不会影响第一个对象?

session - 在 JSF 中登录、注销和存储 session 属性的最佳方法

java - 在 servlet 过滤器中模拟私有(private)字段