如果连接被删除,则禁止通过AJAX重试POST请求

时间:2018-01-26 08:59:51

标签: apache http browser

问题

有时,使用AJAX发送的重要HTTP POST请求会重复,因此在生产数据库中创建了相同数据的多个条目,这当然不是用户所希望的。

重要的是,用户的互联网连接很差,这个请求需要很长时间(9-20秒)。我们无法减少这个时间,因为它是业务逻辑的要求。

请求以http发送,而不是https。

详细

我们有加载PHP模块的Apache / 2.4.18(Ubuntu)和两个前端:一个用于桌面(AngularJS),一个用于移动(React)设备。 AngularJS正在使用$http服务发送请求,而React正在使用whatwg-fetch(也尝试whatwg-fetch-timeout)。

我们从Apache access.log和PHP日志中了解到,同一个请求来自客户端多次,PHP处理它们没有错误。但!这些请求具有200状态代码的响应,%b> 0,%O = 0,这意味着在发送响应之前请求被中止(Apache logging format docs)。

重现

所以我们试图重现并且有时会发生同样的事情。以下案例只是一个复制案例,但这种情况发生在安装了不同浏览器的移动设备(iPhone和Android手机)上。另外,我们在Windows下的Firefox中重复了它。

环境:Windows; Chrome和Firefox;反应前端版本; 无代理

这就是我们发现的:Google Chrome将请求标识为“已停顿”,但内部尝试多次发送请求(实际上是在服务器上接收和处理),因为它收到了网络错误({ {1}})。只有当浏览器成功获取响应时,它才会停止发送重复请求。

收集信息

  1. 来自chrome://net-internals/help.html#events的URL_REQUEST event log(标题也可在那里找到)

  2. Google Chrome开发者工具请求屏幕截图:

  3. 我个人甚至无法重现这一点,我认为良好的互联网连接是其中的原因。

    我google了很多,甚至发现了一些类似的Chromium错误,但没有确切地说明这个问题。

    提前感谢您提供任何有用的信息。

    我也不太确定我应该为这个问题设置哪些标签,所以如果我要添加或删除一些标签,请告诉我。

0 个答案:

没有答案