在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用户邮件列表的参考和示例。