前台发送Ajax请求,经nginx转发给tomcat服务,后台却偶发性收到重复的请求,不是nginx超时重试,是同一时间(一秒时间段内)收到重复请求。
常用的处理方式:前台加遮罩和disable,后台通过redis去重,都已经使用,也确实避免了数据的重复提交。
但始终不能理解这个请求是怎么产生的,测试环境下无论如何也模拟不出来,为了判断是nginx产生的请求,还是前台产生的,在ajax提交时增加一个随机数,nginx日志如下:
###前台遮罩和disable毕竟是有一定延迟的,最好在提交的时候增加一个事务锁。
// 声明事务锁
let locked = false
function doSomeThing () {
if (locked) return false
// 开启事务锁
locked = true
// 异步请求数据
getData(...).then(() => {
// 异步返回数据,解锁
locked = false
})
}
###可以通过浏览器的开发者工具下的network看下,可能是同一个按钮添加了多次事件监听,总之找一下哪里发起这个请求的,看下相关代码,是否有可能出现多次重复调用的问题
###既然随机数不一样,那么肯定是代码触发了多次
那剩下的问题就是打开 network 确认了。
确认之后,再去看代码逻辑