我们如何有效防止在一个会话中并发使用Web应用程序?

时间:2012-05-02 17:32:58

标签: java session spring-mvc

我们已经构建了一个Spring MVC Web应用程序,该应用程序严重依赖于用户按特定顺序执行操作,并且在通常情况下(通过不提供选项)阻止用户绕过这一点(不会非常努力) “转到你不应该在特定时刻去的地方”,当人们在新的标签页或浏览器窗口中打开另一个应用程序实例时,我们遇到了一些问题。

由于应用程序将域模型存储在用户的会话中,使用另一个窗口中的程序可能会弄乱模型的数据,我们已经实现了一个页面ID机制,以正确的顺序验证用户使用该程序并且没有使用浏览器导航,但是当重置程序(这是一个功能,将用户重定向到主屏幕并清除域模型)发生在一个窗口中然后用户尝试执行时,我们仍然面临问题依赖于域模型的东西在另一个窗口中填充有效数据(很快导致NullPointerException)。

3 个答案:

答案 0 :(得分:0)

在会话中存储一些用户详细信息(如ID,姓名,电子邮件)可能没问题,但存储用户的状态(或任何经常更改和/或显着影响其他内容的数据) app)听起来不是一个好主意。

希望以下方法之一适合您:

  • 不要在会话中保存状态 - 在需要时从数据库加载它(在您的情况下,每当用户尝试访问应该按顺序执行的步骤之一时)。如果使用缓存,则不会产生重大的性能影响。
  • 不要在数据库中保存状态,仅在会话中保存 - 适用于有限情况(例如,订购机票),您可以推迟提交域对象,直到流程结束。
  • 将Ajax用于多步骤进程,并且根本不保存状态(除了隐式在浏览器中)。这需要将所有步骤放在一个页面中并对一些代码进行调整。

无论如何,如果有人登录并尝试进入第3步,他们就不应该向他们抛出异常,但这是另一回事。

答案 1 :(得分:0)

如果我是你,我会让用户在网站的其他部分闲逛 - 这些部分不会干扰你的向导过程。但是,一旦他们尝试重新启动它 - 检查会话中是否有PageID,并提醒他们他们还没有完成他们的开始,并询问他们是否要取消/重新启动或继续他们离开的位置。

答案 2 :(得分:0)

如果有人再次阅读此问题:

而不是HttpSession只保留域模型的一个副本,它现在拥有一个集合,我们通过请求/响应传输对单个模型的引用,这样我们就可以在我们的控制器中使用正确的模型和意见。