这个问题让我抓狂,所以也许有人可以帮助我了解问题所在。我有一个以 HAProxy 为前端的 tomcat Web 应用程序。 HAProxy 也在进行 SSL 卸载,并配置为使用粘性 session 。我正在使用 Tomcat 的 session 复制功能,它似乎工作得很好。 session 出现在两个应用服务器上。
出于某种原因,Tomcat 会为每个 Web 请求生成一个新的 JSESSIONID,然后将旧 session 的内容复制到新 session 中。也就是说,我的 session 内容在新 session 中仍然存在,但是会生成一个新的 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 为每个请求生成一个新的 session ID,并将旧 session 的内容复制到新 ID 中。
我怀疑它与 HAProxy 有关,除了/manager 应用程序也在 HAProxy 之后并且它没有表现出这种行为。
为什么 Tomcat 会这样做,我可以做些什么来防止它发生?
最佳答案
原来是Spring Security引起的。我们使用的是 Spring Security 3.1x,默认情况下它将经过身份验证的凭据存储在用户的 session 中。并且为了对抗 session 固定攻击,它会自动将用户 session 的内容复制到新的 session ID 并使旧 session 无效。
修复是将以下内容添加到安全配置中的 http 元素,因为我们不需要在我们的应用程序中使用 session :
create-session="stateless"
希望这对其他人有帮助。
关于java - Apache Tomcat 7 在每次请求时更改 JSESSIONID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14466595/