【问题标题】:Session Invalidated in JBOSS clustered environment with load balancer and sticky session带有负载均衡器和粘性会话的 JBOSS 集群环境中的会话无效
【发布时间】:2013-10-26 22:09:46
【问题描述】:

我们在部署在具有负载平衡器和粘性会话的 JBOSS 集群环境中的 Struts 应用程序中面临一个问题

问题描述

1) 此问题发生在具有 2 个页面(register1.do 和 register2.do 页面)的用户注册功能中

2) 当用户点击注册地址时,https://ourwebsite.com/register1.do

发出了两个 GET 请求

GET register1.do(获取第一个注册页面并在会话中设置一些值)

GET captcha.do(这会加载要在 register1.do 上显示的验证码图像)

3) 有时会发生对 register1.do 的 GET 请求设置一个 JSESSIONID cookie,而对 captcha.do 的 GET 请求 over write JSESSIONID cookie 由第一个请求设置。这会导致第二个注册页面出现问题,因为它会获取存储在会话中的一些值,并且由于会话被验证码覆盖,因此无法获取任何值。 见下图

4) 这种情况并非每次都会发生,一旦发生此问题,如果我们返回 register1.do 页面刷新(F5)/硬刷新(Ctrl + F5),则对验证码的 GET 请求不会结束编写 JSESSIONID cookie 和用户注册工作正常。

而且这只发生在集群环境中,在单个 JBOSS 环境中它工作正常。

  • 谁能帮我找出可能的问题 在这里?

  • 为什么我们刷新页面时会话没有被覆盖?

【问题讨论】:

  • 我有一个类似的问题,使用 mod_cluster 从 apache 到两个 JBoss 服务器进行负载平衡。看来 mod_cluster 不尊重会话粘性,我还没有找到解决它的解决方案。你的技术栈是什么样的?
  • 我对使用 mod_cluster 1.3.1 的 JBoss EAP 7 集群有类似的问题。我正在分享我的问题的链接:[link] (stackoverflow.com/questions/43454068/…)

标签: java cookies jboss load-balancing jsessionid


【解决方案1】:

我在使用 jboss eap 6.1 时也遇到了同样的问题,在负载均衡器中我将使用 mod_cluster 配置我将算法从每个会话的服务器更改为每个会话的条目,并且粘性会话运行良好。通过以下内容了解关于每个会话的条目和每个会话的服务器。

Entry-per-Session 意味着只要源 IP 打开新会话(唯一源端口),设备就会创建额外的客户端表条目。这使该单元可以更准确地跟踪会话数,但它的行为是继续将所有流量从客户端的源 IP 发送到同一服务器。

在 Server-per-Session 模式下,设备以相同方式跟踪唯一源端口,但当客户端打开新会话时,设备会为新会话做出新的负载平衡决策。这样,来自同一客户端 IP 的多个会话可以在所有服务器之间“分散”,而不是被卡在单个服务器上。

【讨论】:

    【解决方案2】:

    将您的 apache mod_cluster 二进制文件更新为 mod_cluster 1.2.6.Final 可用 here

    这为我解决了这个问题,每次刷新后都会跳转服务器。希望这会有所帮助。

    【讨论】:

    • 对我来说,它大部分时间都不会失败。它发生我们打开一个新的浏览器实例并尝试注册,如果我们按 F5/Ctrl+F5(一旦发生错误),那么它在同一个浏览器实例上工作正常并且错误不会再次出现。我们发现的一种模式是,只要 JSESSSION id 出现在 url 中,它就会失败。
    • 那是老bug,当前mod_cluster 1.3.1.Final在url中处理JSESSIONID。
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2019-01-21
    • 2016-01-11
    • 2013-04-18
    • 2018-09-09
    • 2011-06-20
    相关资源
    最近更新 更多