Spring多用户应用程序覆盖会话



我正在开发我的web应用程序与Spring MVC 2.5.6,我需要在它的多个用户会话的一些帮助。我的应用程序的头部显示了登录的用户。

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

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

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

我的问题是:

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

总的来说,我的问题是处理多个用户/会话。

任何帮助都将非常感激。提前感谢。最好的祝福

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

  • 在第一个中,我用user1登录我的应用程序并进入。
  • 在第二种情况下,我使用user2登录并继续。

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

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

如果你在IE和Firefox中打开应用程序,它们将不会共享会话,并且一切都会正常工作。

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

最好还是接受现状吧。让用户知道当他们打开第二个窗口并连接到你的应用程序时,他们已经登录了,并且不允许再次登录。

最新更新