这可能听起来像是经常被问到的问题,但我不是在寻找处理重复请求的解决方案。我只是想知道什么可能导致Apache首先接收重复请求。
我遇到了一个相当零星的问题。我有一个表单在提交时发出POST请求,但请求可能会在一秒钟后以某种方式重复(根据访问日志)。这曾经是一个更常见的问题,因为我们没有优雅地处理它,所以我在表单提交事件期间放入了一些客户端代码来禁用提交按钮。这可以防止双重提交(显然只要启用了javascript),但问题仍然以非常随机的方式存在。我从日志中注意到的一件事是导致问题的客户端是运行Chrome的Android手机。移动Chrome是否会做一些时髦的事情,例如重试它自己的POST请求?在我自己测试时,我永远不会发生重复的POST请求,除非我删除了禁用提交按钮的javascript代码。
Web服务器设置非常简单。没有负载平衡或任何东西,只是运行Apache 2.2.15的单个服务器。我们使用PHP 5.6,但这可能与此无关。
答案 0 :(得分:0)
我想这是用户双击而不是单击,他们使用的应用程序将每次单击转换为新的POST请求。在这里,我将研究应用程序设计。
通常,我使用完全涵盖这一点的框架,因此只能猜测。单击按钮不仅应触发POST请求,而且在操作进行期间也应禁用按钮。所以JavaScript代码看起来像
如果由于POST而导致浏览器导航到另一个页面,那么这根本没有害处。
编辑:看到您确实按照我的建议做了,也许还有另一个原因。 假设用户发布了他们的数据,然后屏幕变暗,或者他们切换了应用程序。当他们重新激活浏览器时,浏览器是否有可能通过重复上一个请求来重新加载页面?
我认为框架通过以重定向作为对POST的响应来覆盖这种情况,并且重定向将通过GET检索数据。由于GET是幂等的,因此可以重复运行而不会造成进一步的损害。