这个问题让我发疯,所以也许有人可以帮助我了解问题所在。我有一个由 HAProxy 引导的 tomcat Web 应用程序。HAProxy 也在进行 SSL 卸载,并配置为使用粘性会话。我正在使用 Tomcat 的会话复制功能,它似乎工作得很好。会话出现在两个应用服务器上。
出于某种原因,Tomcat 会为每个 Web 请求生成一个新的 JSESSIONID,然后将旧会话的内容复制到新会话中。也就是说,我的会话内容还在新会话中,只是生成了一个新的ID并发回给客户端。但它只对我的 Web 应用程序执行此操作。它不会为 /manager 应用程序执行此操作。
我已经尝试了书中的每一个技巧,比如在我的 context.xml 中设置:
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" changeSessionIdOnAuthentication="false" />
并在我的 Context 元素上设置这些属性:
<Context path="/myapp" reloadable="false" override="true" useNaming="false" allowLinking="true" useHttpOnly="false" sessionCookiePath="/" sessionCookiePathUsesTrailingSlash="false">
而且,结果是一样的。Tomcat 为每个请求生成一个新的会话 id,并将旧会话的内容复制到新的 id 中。
我怀疑它与 HAProxy 有关,除了 /manager 应用程序也在 HAProxy 后面并且它没有表现出这种行为。
为什么 Tomcat 这样做,我能做些什么来防止它?