1

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

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

4

3 回答 3

0

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

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

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

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

于 2012-05-02T18:07:43.543 回答
0

万一有人再次阅读此问题:

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

于 2013-06-13T18:55:40.247 回答
0

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

于 2012-05-02T18:08:52.567 回答