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

时间:2011-04-25 11:11:25

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

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

在我的电脑中,我打开两个浏览器(无标签):

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

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

所以,我的问题是:

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

一般而言,我的问题是处理多个用户/会话。

非常感谢任何帮助。提前致谢。 最好的问候

1 个答案:

答案 0 :(得分:2)

  

在我的电脑中,我打开两个浏览器(无标签):

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

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

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

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

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

接受这种情况会更好。让用户知道他们何时打开第二个窗口并连接到您已经登录的应用程序,并且不允许再次登录。