有什么办法在tomcat中的不同应用程序之间共享会话状态?

Ser*_*ipc 51 java session tomcat java-ee

我们希望将工作应用程序拆分为两个不同的.war文件,以便能够更新一个应用程序而不会影响另一个应用程序.每个webapp将具有不同的UI,不同的用户和不同的部署计划.

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

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

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

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

Aar*_*lla 26

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


Ale*_*ler 23

需要注意的是,两个Web应用程序将使用不同的类加载器.如果要共享对象,则需要在同一个类加载器中使用相同版本的类(否则您将获得LinkageErrors).这意味着要么将它们放在由两个Web应用程序共享的类加载器中(例如系统类路径),要么使用序列化来有效地排除和重新构建具有正确版本类的正确类加载器中的对象.


Luí*_*res 7

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

引用:"HttpSession - 允许在应用程序容器(即Tomcat)中性方式中替换HttpSession"


fla*_*nze 6

对于 Tomcat 8,我使用以下配置在 2 个 web 应用程序之间共享会话:

conf/context.xml

<Context sessionCookiePath="/">
    <Valve className="org.apache.catalina.valves.PersistentValve"/>
    <Manager className="org.apache.catalina.session.PersistentManager">
        <Store className="org.apache.catalina.session.FileStore" directory="${catalina.base}/temp/sessions"/>
    </Manager>
    ...
</Context>
Run Code Online (Sandbox Code Playgroud)

我部署了相同的简单 webapp 两次log.warlog2.war

/log
/log2
Run Code Online (Sandbox Code Playgroud)

我现在可以登录/log并显示用户/log2,这不适用于 tomcat 默认配置。

在此处输入图片说明

会话值被设置和读取:

HttpSession session=request.getSession();  
session.setAttribute("name",name);

HttpSession session=request.getSession(false);  
String name=(String)session.getAttribute("name");  
Run Code Online (Sandbox Code Playgroud)

我以这个项目为例:https : //www.javatpoint.com/servlet-http-session-login-and-logout-example

大多数示例/解决方案使用需要更多设置工作的内存数据库:


Kri*_*ris 5

如果to webapps如此紧密耦合以至于他们需要共享对象,为什么要将它分成两部分呢?即使您在某种程度上独立地管理它们,任何体面的构建管理系统都应该能够创建单个WAR文件以进行部署.

像Aaron这样的解决方案建议使用JNDI,但只有当两个webapp都运行在同一台服务器上时才会有效.如果单元是紧密耦合的,那么无论如何你将在同一台服务器上运行它......也许只有一个WAR

如果你真的希望他们独立,我会认真检查两者之间的数据交换.理想情况下,您希望它们仅相互共享相关数据.这些数据可以通过POST(或GET,如果更合适)参数来回传递,您甚至可以考虑使用cookie.