基于以下SO帖子,我试图在两个应用程序上下文之间共享会话(在同一个Tomcat实例上)。
Sharing session data between contexts in Tomcat
我创建了两个类似以下的webapp来测试它。 (每个webapp只包含一个servlet和一个web.xml)
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){}
}
}
<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>
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){}
}
}
<?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实例。任何人都可以建议这是一种正确的方法吗?
虽然会话ID可能取决于配置,但Web应用程序之间永远不会共享会话。当共享ID时,会以正常方式在每个Web应用程序中创建会话,但它们将共享一个公共ID。
对于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默认配置。
会话值设置并读取:
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
大多数示例/解决方案使用内存数据库,这需要更多的设置工作: