Apache Tomcat 7在每个请求上更改JSESSIONID

这个问题让我感到疯狂,所以也许有人可以帮我理解问题所在。 我有一个tomcat web应用程序正面向HAProxy。 HAProxy也在进行SSL卸载,并配置为使用粘性会话。 我正在使用Tomcat的会话复制function,似乎工作正常。 会话出现在两个应用服务器上。

出于某种原因,Tomcat为每个Web请求生成一个新的JSESSIONID,然后将旧会话的内容复制到新会话中。 也就是说,我的会话内容仍然在新会话中,但会生成一个新ID并将其发送回客户端。 但它只对我的Web应用程序执行此操作。 它不会对/ manager应用程序执行此操作。

我已经尝试了本书中的每一个技巧,例如在我的context.xml中设置它:

 

并在我的Context元素上设置这些属性:

  

而且,结果仍然是一样的。 Tomcat为每个请求生成一个新的会话ID,并将旧会话的内容复制到新的id中。

我怀疑它与HAProxy有关,除了/ manager应用程序也支持HAProxy并且它没有表现出这种行为。

为什么Tomcat会这样做,我该怎么做才能阻止它呢?

事实certificate它是由Spring Security引起的。 我们使用的是Spring Security 3.1x,默认情况下它会将经过身份validation的凭据存储在用户的会话中。 并且为了对抗会话固定攻击,它会自动将用户会话的内容复制到新的会话ID并使旧会话无效。

修复是将以下内容添加到安全配置中的http元素,因为我们不需要在我们的应用程序中使用该会话:

 create-session="stateless" 

希望这有助于其他人下线。

当我刷新页面时,我遇到了与新id会话相同的问题在tomcat7服务器上,我只将这个代码添加到context.xml中:

   

这对我来说很好。

不确定你的问题究竟是什么,但有两件事我会检查。 首先,你在tomcat中指定了jvmRoute吗?

Tomcat server.xml

  

Haproxy.cfg (引用jvmRoute)

 server machine1 SERVER_IP cookie machine1 check 

Tomcat将服务器的名称附加到cookie,因此不设置会导致问题。

要检查的另一件事是确保将此行添加到web-app部分的web.xml