一尘不染

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

tomcat

这个问题使我发疯,所以也许有人可以帮助我了解问题所在。我有一个由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为什么要这样做,我该怎么做呢?


阅读 368

收藏
2020-06-16

共1个答案

一尘不染

原来,这是由Spring Security引起的。我们使用的是Spring Security
3.1x,默认情况下,它将身份验证的凭证存储在用户的会话中。为了抵抗会话固定攻击,它会自动将用户会话的内容复制到新的会话ID,并使旧会话无效。

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

create-session="stateless"

希望这可以帮助其他人。

2020-06-16