有时,使用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}})。只有当浏览器成功获取响应时,它才会停止发送重复请求。
来自chrome://net-internals/help.html#events的URL_REQUEST event log(标题也可在那里找到)
Google Chrome开发者工具请求屏幕截图:
我个人甚至无法重现这一点,我认为良好的互联网连接是其中的原因。
我google了很多,甚至发现了一些类似的Chromium错误,但没有确切地说明这个问题。
提前感谢您提供任何有用的信息。
我也不太确定我应该为这个问题设置哪些标签,所以如果我要添加或删除一些标签,请告诉我。