上下文之间的会话共享在Tomcat 7上不起作用

问题描述 投票:1回答:2

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

Sharing session data between contexts in Tomcat

我创建了两个类似以下的webapp来测试它。 (每个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)

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

java session servlets tomcat7 session-cookies
2个回答
2
投票

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


0
投票

对于Tomcat 8(也可能适用于Tomcat 7),我使用以下配置跨2个webapps共享会话:

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.war和log2.war:

/log
/log2

我现在可以登录到/log并让用户显示在/log2中,这不适用于tomcat默认配置。

enter image description here

会话值设置并读取:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.