我一直在研究在多个warl文件之间共享会话数据的解决方案。我遇到了以下解决方案http://www.fwd.at/tomcat/sharing-session-data-howto.html
它的基本思想是,如果你有多个war文件,你可以使用所使用的第一个上下文的sessionid设置一个cookie。
可以使用适用于所有上下文/应用程序的路径设置cookie。
例如,如果我有3个应用程序的以下配置
/myapp/app1
/myapp/app2
/myapp/app3
我可以按如下方式设置cookie
/ myapp sessionid。
然后,sessionid cookie将被发送到地址中带有/ myapp的任何请求。这允许会话id随后被任何上下文使用。
这种方法的唯一问题是它是在2003年编写的,并在Tomcat 4上进行了测试。
您对此方法有何看法?有没有更好的方法呢?
由于
答案 0 :(得分:42)
那篇文章确实已经过时了。
在Tomcat 5.5和6.0上,您只需在emptySessionPath
的{{1}}元素中将true
属性设置为<Connector>
。
/conf/server.xml
在Tomcat 7.0上,这已经改变,因为现在可以从Servlet 3.0 API上配置它。然后,可以通过在任何负责的<Connector ... emptySessionPath="true">
文件中的sessionCookiePath
元素中将/
设置为<Context>
来配置Tomcat。
context.xml
如上所述,有一个新的Servlet 3.0 API,允许您通过标准API配置会话cookie。您可以通过向<Context ... sessionCookiePath="/">
添加以下内容以声明方式执行此操作:
web.xml
或SessionCookieConfig
以ServletContext#getSessionCookieConfig()
编程方式。
<session-config>
<cookie-config>
<path>/</path>
</cookie-config>
</session-config>
您可以在ServletContextListener#contextInitialized()
或HttpServlet#init()
中执行此操作。
答案 1 :(得分:2)
据我所知,没有直接的方法可以做到这一点,但是如果这些上下文共享同一个域,则可以使用域级cookie。
您可以将数据放入cookie中(我不推荐)。
或者设置一个安全的会话ID,您可以使用它来访问某种形式的存储(数据库或分布式缓存等)以检索您需要的数据。
答案 2 :(得分:1)
如果数据量不是天文数据且数据本身变化不太快,您可能需要考虑使用JNDI。此解决方案的设计完全符合您的要求。
您可以查看official documentation或this post to tomcat-user mailing list以获取参考资料&amp;实例
答案 3 :(得分:0)
对于Tomcat 8,我使用以下配置在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
大多数示例/解决方案使用内存数据库,这需要更多的设置工作: