记一次借助MemoryCache解决表单重复提交的问题

在开发接口调用或表单提交的时候,经常遇到由于用户浏览器的问题,导致前端防重复脚本失效,从而产生多条重复请求的情况,所以还需要在后端进行控制,本文是通过缓存来解决。

由于缓存的记录和读取都很快速,因此可以在每次请求到达的第一时间进行记录,方法及注意事项如下:

(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);
                        }
                    });
原文地址:https://www.cnblogs.com/cdoneiX/p/13039946.html