在开发接口调用或表单提交的时候,经常遇到由于用户浏览器的问题,导致前端防重复脚本失效,从而产生多条重复请求的情况,所以还需要在后端进行控制,本文是通过缓存来解决。
由于缓存的记录和读取都很快速,因此可以在每次请求到达的第一时间进行记录,方法及注意事项如下:
(1)缓存应在请求收到的第一时间进行记录,这样才能保证判断的及时准确性。(即在接口代码的最上方位置记录缓存,也可增加Thread.Sleep)
(2)应提取请求数据中的唯一、关键、不会重复的数据或数据集进行记录, 我这里使用了对数据进行MD5加密,再作为缓存Key的方法。
string MD5 = Md5Crypt.Encrypt(string.Join(',', GIDs));//对可以唯一识别一次请求的数据进行Md5加密计算 MemoryCacheHelper memory = new MemoryCacheHelper(); if (memory.Get(MD5) != null) { return new ErrorResult("您已提交,请勿重复提交"); } else { memory.Set(MD5, true, TimeSpan.FromDays(1)); }
(3)当接口执行过程中,如果返回值或抛出错误时,要清除该缓存键,以允许用户继续提交
memory.Remove(MD5); return new ErrorResult("请选择质量检验单创建交货单");
(4)提交成功,则不清除缓存,已保证无法重复提交(例如多人提交相同表单的情况)
(5)前端控制必不可少,采用layer.loading()弹窗遮罩+ajax.complete关闭的方式
var proIndex = layer.load(1, { shade: [0.5, '#000'] //0.1透明度的白色背景 }); $.ajax({ method: 'Post', url: 'xxxx', data: { GIDs: GIDs}, success: function (d) { layer.alert(d.msg); }, error: function (d) { layer.msg(d.responseJSON.msg); }, complete: function () { layer.close(proIndex); } });