根据以下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实例。任何人都可以说这是一种正确的方法吗?
答案 0 :(得分:2)
会话ID永远不会在Web应用程序之间共享,尽管会话ID可能取决于配置。当共享ID时,会以正常方式在每个Web应用程序中创建会话,但它们将共享一个公共ID。
答案 1 :(得分: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>
我两次部署相同的简单Web应用程序 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
大多数示例/解决方案使用内存数据库,这需要更多的设置工作: