0

我在 grails 中有一个应用程序,使用 spring-security 进行用户和角色管理。因为,过去几天我面临一个奇怪的问题:当一个用户在某个时候登录时,用户变成了另一个用户(会话混合)。

示例:用户 A 登录系统,用户 B 从另一个浏览器登录系统,当通过控制器动作移动时,用户 A 在某个随机点成为用户 A 系统中的用户 B,用户 B 也一样。

此问题在生产中,而不是在开发中。

我在互联网上发现了一些类似的案例,但没有一个 grails。 Tomcat 上的 Spring Security/JSF/Hibernate 意外会话劫持?,这个类似的但在 jsf 和提到的解决方案中似乎对我不起作用。另一个是会话混合 - apache httpd 与 mod_jk、tomcat、spring security - 为其他用户提供数据但这里的问题似乎是因为 mod_jk 对我来说不是这种情况(我没有使用 mod_jk)。

我的系统版本:

  • Grails 版本:3.2.4
  • Groovy 版本:2.4.7
  • JVM版本:1.8.0_05
  • 服务器版本:Apache Tomcat/8.5.14
  • JVM版本:1.8.0_121-8u121-b13-0ubuntu1.16.04.2-b13
4

1 回答 1

0

最后,我发现了这个问题。

罪魁祸首是 ISP(目前在尼泊尔的 Subisu 和 Mercantile 发现)。他们实际上会缓存请求的整个页面,并且当另一个用户在特定时间范围内(几个小时)请求相同的 url 时,如果两个用户都在同一个 ISP 网络中,缓存的页面将被呈现给下一个用户。

我是如何发现我的问题的: 我做了一个实验。首先,我在同一 ISP 的不同计算机上使用两个不同的用户登录,我立即发现了问题。然后我在那个 ISP 中注销了一个用户,从那个 ISP 断开,连接到另一个 ISP 并登录到系统。现在,我在 ISP1 的 Computer1 中有 User1,在 ISP2 的 Computer2 中有 User2,即使浏览半小时后也没有发现问题。

我如何修复它: 我生成了唯一的 uuid 并附加到每个菜单链接。这使得每个网址都不同,已经 4 天了,甚至一次都没有发现问题。在某些菜单中,我没有放置唯一的 uuid,仍然是问题,但在我放置唯一字符串的菜单中没有。

于 2017-06-19T01:54:22.357 回答