重复提交一般针对post请求,我的处理方法是这样:
维护一个请求队列,每次post请求过来,生成一个包含url,data,timestamp的对象,push到队列中,后续每来一个post请求都对比一下,看请求队列中是否有url相同并且data相同的请求,如果有则认为是重复请求,当前请求丢弃掉。然后再遍历一下请求队列,比较每一个请求对象的timestamp和当前的timestamp,看请求是否超时,超时的话就将请求从队列中剔除。
然后每个post请求得到响应后,将请求队列中对应的对象剔除掉。
具体代码是这样的:
var interceptor = {
reqQueue: [],
timeout: 30000,
beforeRequest: function(req) {
if (req.method === "post") {
// 创建请求对象
var curReq = {
url: req.url,
data: JSON.stringify(req.data),
timestamp: Date.now()
};
// 检测是否重复请求
if (this.reqQueue.findIndex(item => item.url === curReq.url && item.data === curReq.data) === -1) {
// 非重复请求添加到请求队列
this.reqQueue.push(curReq);
} else {
// 重复请求丢弃掉
req.abort();
}
// 过滤掉超时请求
this.reqQueue = this.reqQueue.filter(item => {
return Date.now() - item.timestamp < this.timeout
});
}
},
afterResponse: function(req, res) {
if (req.method === "post") {
// 过滤掉已完成请求
this.reqQueue = this.reqQueue.filter(item => item.url === req.url && item.data === JSON.stringify(req.data));
}
}
}