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

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

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

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

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

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

  • 如何获得UTF-8在Java webapps中的工作?
  • 官方原因“软件导致连接中止:套接字写入错误”
  • HTTP状态404 - 请求的资源(/)不可用
  • 在两个不同的端口上运行Tomcat服务器
  • 无法find“http://java.sun.com/jsp/jstl/core”的标记库描述符
  • 无法为JSP编译类:无法parsingtypesjava.util.Map $ Entry。 它是从所需的.class文件间接引用的
  • Jetty,Tomcat,Nginx,Geronimo,Glassfish:我很困惑
  • java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):JVM_Bind
  • 8 Solutions collect form web for “任何方式来分享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实例上。