【问题标题】:Apache Tomcat 7 Changing JSESSIONID on Every RequestApache Tomcat 7 在每个请求上更改 JSESSIONID
【发布时间】:2013-01-06 03:47:22
【问题描述】:

这个问题让我发疯了,所以也许有人可以帮助我了解问题所在。我有一个由 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 为什么要这样做,我可以做些什么来防止它?

【问题讨论】:

  • 可能是无状态 JSP?会话=真。 (但在你的情况下不会提示。)
  • 对不起,我没有关注你。我什至没有为我的测试使用 JSP。
  • 我想知道这个的实际问题是什么。如果 JSESSIONID 发生变化会有什么危害?

标签: java session tomcat haproxy jsessionid


【解决方案1】:

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

Tomcat server.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="machine1">

Haproxy.cfg(引用 jvmRoute)

server machine1 SERVER_IP cookie machine1 check 

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

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

<distributable />

【讨论】:

  • 感谢您的建议,我已尝试过,但无济于事。另外,我不相信 HAProxy 使用 jvmRoute。我过去在使用 apache 时使用过它,但是 HAProxy 在发送到客户端之前会将配置的服务器名称添加到 cookie 本身。
  • 忘记添加了,我的 webapp 已经标记为可分发。正如我所说,我的会话复制工作正常。
  • @Unsavory 抱歉,我帮不上忙,但我认为值得一试。我们使用相同的配置,并且在设置时遇到了类似的问题。在我们的例子中,这是因为 HAProxy 正在破坏 cookie,并且它会定期在服务器之间反弹。在 Tomcat 上设置 jvmRoutecookieappsessionserver 相应地为我们修复了它。
  • 感谢您的努力,但这似乎不是我们的问题。此外,带有粘性会话的负载平衡工作正常。我们永远不会在服务器之间反弹。就像我在问题中所说的那样,管理器应用程序一切正常,所以这与我的 web 应用程序的配置有关,但一直无法弄清楚那是什么。
【解决方案2】:

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

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

create-session="stateless"

希望这可以帮助其他人。

【讨论】:

  • 至少从 Spring Security 3.2.5 开始,还有默认激活的会话固定行为。在自定义WebSecurityConfigurerAdapter 中配置HttpSecurity httphttp.sessionManagement().sessionFixation().none(); 可以解决问题。然后仔细检查其含义(不再自动固定会话)。
【解决方案3】:

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

<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" changeSessionIdOnAuthentication="false" />

<Context path="/myapp" reloadable="false" override="true" useNaming="false" allowLinking="true" useHttpOnly="false" sessionCookiePath="/" sessionCookiePathUsesTrailingSlash="false">

这对我来说很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多