阻止选项卡或相同浏览器窗口之间的共享会话

时间:2017-01-12 07:58:41

标签: java spring jsp tomcat servlets

我必须修复这个基本的Web应用程序,它允许查看数据,说客户数据,并使用Tomcat和Spring框架进行编辑。当我尝试同时从不同的浏览器标签编辑不同的客户数据时,我的问题就出现了;编辑后的数据变得混杂。如果我在一个标签中打开客户A进行编辑,我在另一个标签中打开客户B,然后我返回编辑客户A并保存,客户A的最后一次更改将应用​​于客户B.

稍微调查此问题是因为客户数据存储在会话中,但此会话在不同选项卡之间共享。因此,当我在一个选项卡中打开客户A时,此客户存储在会话中,但是当我在另一个选项卡中打开客户B时,最新的是存储的客户。因此,当我完成对客户A的编辑并且我提交表单时,更改将应用​​于在会话中找到的客户,即客户B.

我在这里看到了解决问题的不同方法。一种解决方案是阻止用户在多个选项卡中打开我们的应用程序,但它太复杂了,我觉得它很脏。另一种解决方案是简单地为不同的选项卡使用不同的会话,但我不确定如何实现这一点。阅读此论坛后,我发现另一篇文章提到在Tomcat的context.xml文件中使用设置' cookies = false'但是整个应用程序都失败了,我不想在不是我的代码中触摸超过必要的内容。另外我看到提到使用HTML5 SessionStorage,但我找不到任何实现它的好例子。

我认为这必须是一个常见问题,标签之间的共享会话,并且它必须有一个共同的解决方案。在这种情况下,什么解决方案适合?

修改

我们说我有这段代码:

@RequestMapping(value = "edit.do", method = RequestMethod.GET)
    public String edit(@RequestParam(value = "id", required = false) Long customerId, Map modelMap) {
    Customer customer = getCustomer(customerId);
    modelMap.put("customer", customer);
    return "customer";
}

@RequestMapping(value = "save.do", method = RequestMethod.POST)
public void save(@ModelAttribute("customer") Customer customer, OutputStream outputStream,
        HttpServletResponse response) throws IOException {
    save(customer);
}

我不确定modelMap.put("customer", customer);是什么,但我假设客户存储在会话中。我可以在jsp页面中成功添加隐藏字段,并通过添加@RequestParam(value = "customerId", required = true) Long customerId,在保存方法中从数据库中检索客户现在我的问题是,我在@ModelAttribute("customer") Customer customer的保存方法中得到的客户是客户从jsp或会话中存储的客户提交?此外,如果这是存储在会话中的那个,我该如何检索jsp中所做的更改?

1 个答案:

答案 0 :(得分:0)

为什么要实现这个?你可能注意到几乎没有人这样做。并非总是如此,但这通常表明您的意图最初是错误的。 就我个人而言,在不同的标签中进行不同的会话是完全令人困惑的。我宁愿使用“隐身模式”或其他浏览器。或者考虑一些UI变化。

E.g。如果需要单独的会话,“在新标签中打开”将不会以通常的方式工作。