【问题标题】:How do I handle Http request race conditions in a Front Controller web application?如何在前端控制器 Web 应用程序中处理 Http 请求竞争条件?
【发布时间】:2014-07-10 09:50:44
【问题描述】:

我有一个 Web 应用程序,它是前端控制器模式的实现,如下图所示。具体来说,我遵循了前端控制器模式的代码示例,如该问题的答案中所述:

Design Patterns web based applications

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

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

我还在弹出窗口上实现了一个 onClose 函数,它调用了 window.location.reload()。然而,这个调用中断了前端控制器,它停止了它当前正在做的一切,以处理最新的请求。这会产生竞争条件,在前端控制器开始重新加载页面之前,有时可以插入/删除数据,有时则不能。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 逐行响应:我的弹出编辑器在提交时不会自动重新加载父窗口。我已经手动实现了它,因为它是我能够工作的唯一重新加载功能。我试图将变量传递回浏览器,这应该会触发页面重新加载,但我无法让它工作。另外,这会触发服务器端两次加载数据,导致性能不佳,所以我宁愿弄清楚为什么服务器端数据第一次显示不正确(缓存?)。
    • 我认为你答案的后半部分绝对值得考虑。实施可以稳定我当前尝试的东西会容易得多。 Ajax 解决方案使我在我的经验有限的领域工作,我担心那里可能会出现类似的小错误,我无缘无故地重组了我的代码。尽管如此,我已经非常接近准备放弃我目前的尝试,转而寻求 Ajax 解决方案...
    • 你应该让你的弹出编辑器只有在收到服务器的响应后才重新加载页面,否则会中断请求。这样,您将在重新加载窗口之前知道数据已在服务器端更新。例如,服务器响应可能只包含 javascript reload 调用。基本上是一个空页面,正文中只有 javascript window.location.reload() 调用。然后响应将非常轻量级,从用户的角度来看,似乎在弹出提交后立即重新加载了窗口。
    • 我绝对需要更好地理解响应。这似乎是目前最好的建议,所以我深表感谢,并接受你的回答。 :)
    • 采用前端控制器模式,浏览器在弹出 iframe 中接收到的来自服务器的 HTTP 响应将包含操作返回的视图。该视图只需要包含一个 javascript reload 调用,当然还有适当的 HTML 标记。
    猜你喜欢
    • 2011-02-04
    • 2022-11-18
    • 2017-07-26
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2011-04-01
    相关资源
    最近更新 更多