3

我有一个 tomcat 服务器,在上面部署了 10 个 Web 应用程序。我有一个过滤器,它从一个应用程序(比如“A”)读取传入请求,读取某个 cookie 值,并根据 cookie 的值从数据库中获取另一个上下文名称(比如“B”)。然后,该过滤器将具有上下文 A(eg ) 的请求重写为http://1.1.1.1/A/XYZServlet具有上下文 B (eg ) 的新请求http://1.1.1.1/B/XYZServlet

这样做时,执行新请求时所有会话变量都将丢失。当我的过滤器将旧请求(上下文 A)重定向到新请求(上下文 B)时,如何确保保留会话和所有会话变量(与上下文 A 相关)?由于某些架构原因,在 server.xml 中设置 emptySessionPath = "true" 不是解决方案。

4

1 回答 1

0

Tomcat 会话的范围仅限于单个 Web 应用程序。在您的情况下,当您切换到不同的上下文时,会话数据不会丢失,但根本不适用于新的上下文。范围由会话 cookie 的路径控制,它将包含创建 Web 应用程序的上下文,因此仅针对该上下文中的请求发送到 Tomcat。

如果您想扩展会话的范围,可以想到几个选项: 您可以将会话 cookie(JSESSIONID默认情况下)修改为根上下文路径/。然而,会话 cookie 管理非常深入地嵌入在 Tomcat 中,并且很难(如果不是不可能)修改。我曾经尝试将会话 cookie 更改为具有固定有效期的持久性,但没有找到这样做的方法。

一个不太优雅但可能有效的方法是复制会话 cookie。我不确定它是否会起作用,但在您的过滤器中,您可以读取会话 cookie 并创建一个以目标上下文作为路径的副本。在后续请求中,将包含伪造的会话 cookie,可能使您之前的会话数据可用。

于 2012-10-31T14:00:06.893 回答