【问题标题】:Spring multiuser application overrides sessionSpring 多用户应用程序覆盖会话
【发布时间】:2011-08-12 06:36:34
【问题描述】:

我正在使用 Spring MVC 2.5.6 开发我的 Web 应用程序,我需要一些帮助来处理其中的多个用户会话。我的应用程序的标题显示登录的用户。

在我的电脑上,我打开了两个浏览器(没有标签):

  • 在第一个中,我使用 user1 登录我的应用程序并进入。在标题中,user1 出现。
  • 第二次,我使用 user2 登录并继续。在标题中,user2 出现。

然后,我切换到第一个浏览器,向控制器提交操作,当再次显示应用程序时,在标题 user2 出现,这是错误的,因为我使用 登录用户1.

所以,我的问题是:

  • SecurityContextHolder.getContext().getAuthentication().getName() 可能不是获取具有许多用户的登录用户的正确方法,因为它是单例的(不是吗?)。我怎么能这样做?
  • 会话对象也会出现这种错误情况,因此 user1 存储在会话对象中的数据(由 request.getSession().setAttribute(...)request.getSession.getAttribute(...) 管理)被 user2 覆盖数据。
  • 在这个 StackOverflow 问题Handling Session ID with Spring 中,建议管理会话 ID 以分离数据。我应该在我的应用程序内部手动管理每个带有会话 ID 的用户数据吗?如何获取会话 ID?

一般来说,我的问题在于处理多个用户/会话。

任何帮助将不胜感激。提前致谢。 最好的问候

【问题讨论】:

  • 到底是什么问题?当您使用两个浏览器时,您有两个会话,不同的用户登录,这就是它的工作方式。
  • 问题是我不知道会话是在同一个浏览器实例之间共享的。但这似乎是正常的行为。谢谢axtavt

标签: spring session spring-mvc concurrency spring-security


【解决方案1】:

在我的电脑上,我打开了两个浏览器(没有标签):

  • 在第一个中,我使用 user1 登录我的应用程序并进入。在标题中,出现了 user1。
  • 在第二个中,我使用 user2 登录并继续。在标题中,出现了 user2。

然后,我切换到第一个浏览器,向控制器提交一个操作,当再次显示应用程序时,在标题中出现user2,这是错误的,因为我使用user1登录。

在会话正常实现的情况下,如果客户端在同一台机器上运行同一浏览器的两个窗口或选项卡,这是正常行为,因为它们共享会话。

如果您在 IE 和 Firefox 中打开该应用,它们将不会共享会话,一切都会正常运行。

我不相信有办法让浏览器停止在窗口之间共享会话,所以如果你需要它们独立行动,你基本上需要创建自己的会话机制,可能通过使用隐藏字段或一些这种 hack 而不是正常机制使用的 cookie 或 url 重写。

接受现状会更好。当用户打开第二个窗口并连接到您的应用时,让他们知道他们已经登录,并且不允许再次登录。

【讨论】:

  • +1(但前提是 OP 确实两次使用同一个浏览器^^)
  • @Axel - 确实 - 如果这种情况发生在这种情况之外,那就是真正的问题,我想看看代码。
  • 好的,谢谢大家。这对我来说更好,所以这不是我的应用程序中的事件或错误行为。再次感谢
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2020-12-29
  • 2019-08-27
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多