我有一个tomcat服务器,我在其上部署了10个Web应用程序。
我有一个Filter,它从一个应用程序读取传入请求(比如“A”),读取某个cookie值,并根据cookie的值从数据库中获取另一个上下文名称(Say“B”)。
然后,此过滤器将具有上下文A(例如http://1.1.1.1/A/XYZServlet
)的请求重写为具有上下文为B的新请求(例如http://1.1.1.1/B/XYZServlet
)。
执行此操作时,执行新请求时会丢失所有会话变量。 当我的过滤器将旧请求(上下文A)重定向到新请求(上下文B)时,如何确保保留会话和所有会话变量(与上下文A相关)? 由于某些架构原因,在server.xml中设置emptySessionPath =“true”不能成为解决方案。
答案 0 :(得分:0)
Tomcat会话的范围限定为单个Web应用程序。在您的情况下,当您切换到不同的上下文时,会话数据不会丢失,但根本不适用于新上下文。范围由会话cookie的路径控制,它将包含创建Web应用程序的上下文,因此仅发送给Tomcat以获取该上下文中的请求。
如果要扩展会话的范围,可以考虑以下几个选项:您可以将会话cookie(默认情况下为JSESSIONID
)修改为根上下文路径/
。然而,会话cookie管理非常深入地嵌入在Tomcat中,并且很难(如果不是不可能的话)进行修改。我曾尝试将会话cookie更改为具有固定有效期的持久性,但没有找到方法。
不太优雅但可能正在工作的方式是复制会话cookie。我不确定它是否可行,但在您的过滤器中,您可以读取会话cookie并使用目标上下文创建副本作为路径。在后续请求中,将包含伪造的会话cookie,可能使您以前的会话数据可用。