任何方式来分享tomcat的不同应用程序之间的会话状态?

我们希望将工作应用程序分成两个不同的.war文件,以便能够更新一个应用程序而不会影响其他应用程序。 每个webapp将有不同的用户界面,不同的用户和不同的部署时间表。

最简单的path似乎是共享相同的会话,所以如果应用程序设置session.setAttribute("foo", "bar")应用程序B将能够看到它。

有没有办法在同一个Tomcat实例中为这两个应用程序共享HttpSession状态?

我们的应用程序运行在一个专用的Tomcat 5.5上,没有其他的应用程序在同一个tomcat实例上运行,所以关于会话共享的任何安全问题都不成问题。 我们正在运行多个Tomcat实例,但平衡器正在使用粘性会话。

如果这是不可能的,或者这个会话共享是一个非常糟糕的主意,请发表评论。

你不应该分享HttpSession; 但是可以共享其他对象。 例如,您可以通过JNDI注册一个对象,并在您的所有应用程序中访问相同的对象(数据库使用此对象来连接池)。

有一件事要注意的是,两个Web应用程序将使用不同的类加载器。 如果你想共享对象,他们需要使用同一个类加载器的相同版本(否则你会得到LinkageErrors)。 这意味着要么将它们放在两个Web应用程序(例如系统类path)共享的类加载器中,要么使用序列化来有效地排除和重构正确的类加载器中的对象。

如果Web应用程序紧密耦合,以至于需要共享对象,那么为什么要将它分成两部分? 即使你独立地pipe理它们,任何体面的构buildpipe理系统都应该能够创build一个WAR文件来部署。

像Aaron提出的使用JNDI的解决scheme是可行的,但前提是两个webapps都运行在同一台服务器上。 如果这些单元是紧密耦合的,并且您将要在同一台服务器上运行它,那么最好还是有一个WAR

如果你真的希望他们独立的话,我会认真考察两者之间的数据交换。 理想情况下,你希望他们只能分享相关的数据。 这些数据可以通过POST(或更合适的GET)参数来回传递,你甚至可以考虑使用cookies。

如果你想使用Spring,有一个名为Spring Session的项目: https : //github.com/spring-projects/spring-session

引用: “HttpSession – 允许以应用程序容器(即Tomcat)中性方式replaceHttpSession”

在这篇博文中描述了一个这样做的方法: 在Apache Tomcat中进行会话共享

简介:将emptySessionPath添加到连接器configuration并将crossContext添加到上下文

你可以通过你的上下文根来获取servlet上下文。

用于检索variables。

 request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute(variableName) 

对于设置variables:

 request.getSession().getServletContext().getContext("/{applicationContextRoot}").setAttribute(variableName,variableValue) 

注意:这两个应用程序应该部署在同一台服务器上。

如果您发现任何问题,请让我知道

Tomcat 8:我必须这样做: <Context crossContext="true" sessionCookiePath="/">在conf / context.xml

在这里configuration属性的更多细节

然后设置值(如@卡齐的答案):

 ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath") servletContext.setAttribute(variableName,variableValue) 

获得价值:

 ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath") servletContext.getAttribute("user"); 

您不应该通过高可用性按顺序拆分您的应用程序。 您可以将整个应用程序部署在许多tomcat实例上。