在Tomcat中的上下文之间共享会话数据

我一直在寻找在多个战争文件之间共享会话数据的解决scheme。 我遇到了以下解决schemehttp://www.fwd.at/tomcat/sharing-session-data-howto.html

其基本思想是,如果您有多个war文件,则可以使用所使用的第一个上下文的sessionid来设置cookie。

可以使用适用于所有上下文/应用程序的path来设置Cookie。

例如,如果我有以下configuration3个应用程序

/myapp/app1 /myapp/app2 /myapp/app3 

我可以设置一个cookie如下

/ myapp sessionid。

sessionid cookie将被发送到地址中带有/ myapp的任何请求。 这允许会话ID然后被任何上下文使用。

这种方法唯一的问题是它是在2003年编写的,并在Tomcat 4上进行了testing。

你对这种方法有什么看法? 有没有更好的方法呢?

谢谢

那篇文章确实已经过时了。

在Tomcat 5.5和6.0上,您可以在/conf/server.xml中的<Connector>元素/conf/server.xml emptySessionPath属性设置为true

 <Connector ... emptySessionPath="true"> 

在Tomcat 7.0上,这已经改变了,因为现在可以从Servlet 3.0 API上configuration。 然后在Tomcat的一端可以通过在任何context.xml文件中将sessionCookiePath设置为/ in <Context>元素进行configuration。

 <Context ... sessionCookiePath="/"> 

如上所述,有一个新的Servlet 3.0 API,允许您通过标准APIconfiguration会话cookie。 您可以通过将以下内容添加到web.xml来声明性地执行此操作:

 <session-config> <cookie-config> <path>/</path> </cookie-config> </session-config> 

或者通过由ServletContext#getSessionCookieConfig()提供的SessionCookieConfig来编程。

 getServletContext().getSessionCookieConfig().setPath("/"); 

你可以在ServletContextListener#contextInitialized()HttpServlet#init()做到这一点。

也可以看看:

  • Tomcat 5.5 HTTP连接器文档
  • Tomcat 6.0 HTTP连接器文档 – 提到潜在的安全漏洞
  • Tomcat 7.0上下文文档

据我所知,没有直接的方法来做到这一点,但是,如果这些上下文共享相同的域,则可以使用域级cookie。

你可以把数据放在cookie中(我不build议这么做)。

或者把一个安全会话Id,你可以使用访问某种forms的存储(数据库或分布式caching等)来检索你需要的数据。

如果数据量不是天文数据,而且数据本身的变化也不是很快,那么可以考虑使用JNDI。 这个解决scheme是专门为你正在寻找的。

你可以看看官方文档或这篇文章到tomcat用户邮件列表的参考和示例。