会话混合-Apache httpd与mod_jk,tomcat,Spring Security-提供其他用户的数据

stu*_*tue 5 tomcat apache2 mod-jk spring-security

最近,我们面临着一个严重的问题,即向一个用户提供了另一个用户的数据。这个问题几乎不可能重现。

我们使用的是Spring-security提供的标准登录用户管理,我们确信问题不在于将用户存储在应用程序中的实例变量或类似的并发内容中。

我们真的怀疑问题出在SpringSecurity还是Tomcat本身。

我们的前服务器是apache httpd,通过ajp连接器(mod_jk)连接到tomcat。我们没有进行任何负载平衡(httpd只关心SSL,一些URL重写和提供一些php模块)

这是我们的设置:

## OS
OS Name:        Linux 
OS Version:     2.6.32-5-686
Architecture:   i386

## Apache httpd
Server version: Apache/2.2.16 (Debian)
Server built:   Sep  4 2011 20:27:42

## mod_jk
mod_jk/1.2.30 (installed via apt-get)

## JVM
JVM Version:    1.6.0_18-b18
JVM Vendor:     Sun Microsystems Inc.

## Tomcat
Server version: Apache Tomcat/6.0.28
Server built:   February 12 2011 1443
Run Code Online (Sandbox Code Playgroud)

我们将此会话归咎于httpd / mod_jk,所以我们唯一的解决方案是删除apache httpd。但是在我们离开这种流行且广泛使用的配置之前,我们想知道是否有人遇到过类似的问题。

我发现的唯一类似问题是负载平衡或mod_jk。

您是否曾经遇到过类似的问题?任何提示,想法,链接或经验将不胜感激。谢谢!

Mak*_*das 1

可能的问题之一可能是第二次登录尝试。考虑以下情况:

  • 用户打开两个浏览器选项卡和两个登录表单。
  • 选项卡 1:以 user_1 身份登录。将一些数据加载到 HTTP 会话中。
  • 选项卡 2:以 user_2 身份登录。将一些数据加载到 HTTP 会话中。

在大多数浏览器中,这将是相同的 HTTP 会话。因此,实际上您将在一个 HTTP 会话中合并来自 user_1 和 user_2 的数据。任何使用会话对象的页面都可能受到影响。

您在这里有两个选择:

  • 防止出现这种情况。检测第二次登录尝试并要求用户首先注销。使用 Spring Security 很容易,请参阅下面的代码。
  • 如果您绝对需要每个浏览器选项卡一个帐户,那么您可以将会话数据存储在每个用户名的地图中。

由于并发会话控制功能,您可以防止第二次登录尝试:

<http>
    ...
    <session-management>
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
    </session-management>
</http>
Run Code Online (Sandbox Code Playgroud)

您的应用程序中已经完成了吗?