我们希望将工作应用程序拆分为两个不同的.war文件,以便能够更新一个应用程序而不会影响另一个应用程序.每个webapp将具有不同的UI,不同的用户和不同的部署计划.
最简单的路径似乎是共享相同的会话,所以如果应用程序A设置session.setAttribute("foo", "bar")应用程序B将能够看到它.
有没有办法HttpSession在同一个Tomcat实例中共享两个应用程序的状态?
我们的应用程序运行在专用的Tomcat 5.5上,没有其他应用程序在同一个tomcat实例上运行,因此任何有关会话共享的安全问题都不是问题.我们正在运行多个Tomcat实例,但平衡器正在使用粘性会话.
如果不可能或者这次会话分享是一个非常糟糕的主意,请发表评论.
是否有任何Tomcat API或配置可以告诉应用程序(可能在启动时),它在没有请求的情况下运行的端口是什么?
想象一下,有两个Web应用程序在同一个Tomcat中运行,其中一个需要从另一个调用Web服务.我们不希望请求离开Tomcat(如果您使用Apache服务器名称或绝对URL,请求将退出并再次返回,它可以转到任何实例)并返回.为此,我知道机器名称但无法获取端口号.我知道我可以硬编码这些信息,但我不想这样做,因为我希望我的war文件与应用服务器无关.
我知道如果我们有HTTPServletRequest,我们可以找到它
这仅适用于Tomcat 6,不适用于Tomcat 7
我有2个webapps在两个上下文中运行:c1,c2(都紧跟在root之后).我把一个startupListener放在c1中共享一个变量,另一个放在c2中来检索它.
我在c1中的startuplistener是:
public void contextInitialized(ServletContextEvent sce) {
HashMap <String,Object> database ;
//some code to init database
ServletContext context = sce.getServletContext().getContext("/c1");
if (context!=null)
{
context.setAttribute("crossContext", true);
context.setAttribute("cache", database);
}
}
Run Code Online (Sandbox Code Playgroud)
在c2应用程序中,它是这样的:
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext().getContext("/c1");
HashMap<String,Object> database = (HashMap) context.getAttribute("cache");
}
Run Code Online (Sandbox Code Playgroud)
c2的startupListener中的上下文总是为null,我试过'/ c1','c1'.我错过了什么?(我正在使用tomcat6,如果重要的话)谢谢