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

Nob*_*ody 7 java session tomcat haproxy jsessionid

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

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

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

<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" changeSessionIdOnAuthentication="false" />
Run Code Online (Sandbox Code Playgroud)

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

<Context path="/myapp" reloadable="false" override="true" useNaming="false" allowLinking="true" useHttpOnly="false" sessionCookiePath="/" sessionCookiePathUsesTrailingSlash="false">
Run Code Online (Sandbox Code Playgroud)

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

我怀疑它与HAProxy有关,除了/ manager应用程序也在HAProxy后面,它没有表现出这种行为.

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

Nob*_*ody 6

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

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

create-session="stateless"
Run Code Online (Sandbox Code Playgroud)

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