任何方式来分享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实例上。