如何在Front Controller Web应用程序中处理Http请求竞争条件?

时间:2014-07-10 09:50:44

标签: java web-applications synchronization race-condition front-controller

我有一个Web应用程序,它是Front Controller Pattern的一个实现,如下图所示。具体来说,我已按照前端控制器模式的代码示例进行操作,如本问题的答案中所述:

Design Patterns web based applications

Front Controller

我正在更新我的一个.jsp页面的问题。该页面特别有一个弹出编辑器,允许用户添加或删除外部数据库中数据集的链接。如果用户点击保存按钮,它会发送一个请求,该请求由前端控制器拦截。然后,在系统自身的数据库上执行保存或删除引用链接(多对多ID号)的正确操作。之后,应重新加载页面,这会触发链式命令,该命令从两个数据库加载数据,然后重定向到基本相同的页面,而不显示弹出窗口。

但是,由于我不理解的某种形式的缓存,页面不会重新加载。我已经尝试了我能找到的每个解决方案,以防止加载缓存数据,向URL添加唯一值,在jsp页面上添加元标记,以防止缓存。我已经确认数据正在服务器端加载。一个简单的F5点击更新页面就像它应该自动完成。

我还在弹出窗口上实现了一个onClose函数,它调用了一个window.location.reload()。但是,此调用会中断前端控制器,并且会停止当前正在执行的所有操作,以处理最新请求。这会创建一个竞争条件,在Front Controller开始重新加载页面之前,有时可以插入/删除数据,有时不能插入/删除数据。

我应该排队吗? 是不是有理由不这样做? Front控制器的执行方法或类本身是否应该实现某种同步?

1 个答案:

答案 0 :(得分:0)

您的弹出编辑器应放在iframe中,以便在提交时不会重新加载窗口。从iframe发送的请求返回的响应应该触发window.location.reload()。例如:

<html>
  <script type='text/javascript'>
    window.onload = function() {
      window.location.reload();
    };
  </script>
</html>

另一种选择是使用Ajax调用发送更新,然后在Ajax调用返回时重新加载页面。或者更好,无需重新加载动态更新页面,但使用Ajax调用返回的JSON数据。