java - Apache Tomcat 7 在每次请求时更改 JSESSIONID

标签 java session tomcat haproxy jsessionid

这个问题让我抓狂,所以也许有人可以帮助我了解问题所在。我有一个以 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/

相关文章:

PHP:重新加载时重置 session 生命周期

tomcat - tomcat 5.5.25 上的 x-forward-for

tomcat - 使用 Solr 时在 Tomcat 中“未创建核心”

java jsp if语句

java - 如何初始化取决于组件大小的图像抓取?

java - 检测 JPanel 卸载/关闭事件

java - 如何为特定的url启用spring security

java - 是否有可能在jsp中保存或缓存表单数据

java - UDP - 无法从 DatagramPacket 获取数据

laravel - 数据在 Laravel session 中持续多长时间?