一个Java Web应用程序的多选项卡问题-混合来自两个不同记录的数据

一个Java Web应用程序的多选项卡问题-混合来自两个不同记录的数据,java,javascript,jquery,session,struts,Java,Javascript,Jquery,Session,Struts,问题: 每当我们为同一会话在浏览器的两个不同选项卡中保存两个不同记录的数据时,相应保存记录的数据就会混淆 场景: 1) 选项卡1:打开浏览器,登录应用程序,进入搜索屏幕。(在我们的案例中是担保人搜索屏幕) 2) 选项卡2:在同一浏览器中打开另一个浏览器选项卡,复制上一步的URL并将其粘贴到当前选项卡中,现在在两个选项卡中打开搜索屏幕 3) 返回Tab1并搜索一个担保人(例如:编号为34526的担保人),在搜索屏幕中获得结果后打开一次 4) 然后转到Tab2,搜索另一个担保人记录并打开该记录 5)

问题: 每当我们为同一会话在浏览器的两个不同选项卡中保存两个不同记录的数据时,相应保存记录的数据就会混淆

场景: 1) 选项卡1:打开浏览器,登录应用程序,进入搜索屏幕。(在我们的案例中是担保人搜索屏幕)

2) 选项卡2:在同一浏览器中打开另一个浏览器选项卡,复制上一步的URL并将其粘贴到当前选项卡中,现在在两个选项卡中打开搜索屏幕

3) 返回Tab1并搜索一个担保人(例如:编号为34526的担保人),在搜索屏幕中获得结果后打开一次

4) 然后转到Tab2,搜索另一个担保人记录并打开该记录

5) 现在单击编辑按钮编辑在Tab2中打开的记录,然后返回Tab1,而不编辑Tab2中的数据

6) 现在,单击编辑按钮编辑在Tab1中打开的记录,然后进行修改,并在此屏幕中执行一些操作,如“保存”操作,同时转到Tab2并单击此屏幕上的“保存”操作。现在,我们单击了Tab1上的save按钮,同时在Tab1完成其save操作之前,我们还在Tab2中执行了另一个操作(即save)

7) 现在,这两个屏幕的数据都混在一起了(这不是一个正确的行为)。在这种情况下,数据不应混淆,应正确保存以用于相应的记录。 请注意,在上述场景中,两个选项卡的打开屏幕相同,但记录不同。(例如:打开“编辑担保人”屏幕,但有两条不同的担保人记录)

客户首选解决方案:

应用程序应该允许对在多个选项卡中打开的记录进行更改,而不会中断应用程序流。在这种情况下,登录到应用程序的用户将是相同的,应用程序应允许多选项卡功能,而不会混淆数据

问题的可能根本原因是:

1) IE 7及以上版本的浏览器在整个浏览器中保持单个会话,即使您打开新窗口,它也将具有相同的会话。 因为我们使用的是IE8,所以即使通过不同的选项卡,它也可以维护单个会话。这可能造成了这个问题

我们对上述问题做了一些研究,也查阅了一些博客,但我们无法找到问题的正确解决方案

我们检查了一些东西来解决此问题,如:

1) SessionStorage概念可从HTML5获得,并可从IE8+浏览器获得支持,但此解决方案不支持我们上面提到的要求。如果有人得到了上述结果的帮助,请让我们知道

2) 我们找到了另一种解决方案:URL重写(添加会话详细信息和一些独特的详细信息以区分会话,并维护一些隐藏字段以跟踪每个页面中的会话)-但这非常复杂,而且我们不确定这是否解决了上述问题。请让我们知道在这方面是否有任何建议

我们还尝试了一些JavaScript编码的示例,但没有得到所需的解决方案


如果有人已经在他们的应用程序中实现了,我们希望得到一些指导或类似的解决方案。

您是否尝试设置表单bean的范围以请求?默认情况下,struts的表单bean是会话范围的。因此,您要发布回服务器的bean在选项卡之间共享。如果将作用域设置为request,那么在不同的选项卡中将有不同的表单bean。这将确保当用户点击save时,数据不会混淆

我在几个struts应用程序中看到了这个问题,这些应用程序要求用户在多个页面上填充数据(用户在一个页面上填充数据,然后单击“下一步…”到达最后一个页面,然后单击“保存”,然后将数据保存到数据库中)。当用户单击next转到下一个页面时,当前页面(表单)数据保存在HttpSession中(如果bean作用域是session,Struts会自动这样做)。当用户在多个选项卡或浏览器窗口中打开应用程序(假设用户在多个窗口中使用相同的浏览器(例如IE))并对不同记录的表单执行操作时,数据会在同一会话中保存/覆盖并损坏。你的情况也类似

正如您正确指出的,JSSessionID的实现有点复杂,因为如果您在web页面上呈现一些链接(从xml文件指向应用程序的其他部分的链接),则需要将JSSessionID嵌入URL,否则服务器将分配一个新的JSSessionID,并将用户重定向到登录页面(假设您的企业应用程序要求用户首先登录)(动态生成的链接中已经嵌入了JSSessionID)。这种方法的第二个问题是:如果用户右键单击任何链接(假设JSSessionID嵌入其中)然后选择“在新窗口/选项卡中打开”,然后导航到其他记录进行编辑,您的数据将被损坏(请注意,当用户为链接选择“在新选项卡中打开”时,该链接的URL将已经具有来自父窗口/选项卡的相同jsessionID)

要解决此问题,您必须在应用程序中进行一些设计更改。以下是可能的方法

您可以将数据存储在缓存中,而不是将数据存储在HttpSession中(您可以使用自己的逻辑将数据存储为键值对,如下所述)。我想您必须遵循以下步骤: a) 将bean范围更改为从会话请求。 b) 每个窗口/选项卡都有一个唯一的标识符。您可以使用windows.name属性进行相同的操作。这个地产
    HashMap -> key will be the jessionID and value will be another HashMap.
          - HashMap(value of the first Map) -> key will be tab/windows name sent from the browser. Value will be another HashMap.
                   - HashMap (value of the second map) -> Key will be form name. Value will be the actual form. (this map will have only one entry, if you have only one form).

d) Once you approach on the last page, get all the forms from the Map for the desired tab/window and save in the database.