• 记一次借助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);
                            }
                        });
  • 相关阅读:
    bash的shebang行
    Step By Step(Lua调用C函数)
    [Android问答] px、dp和sp,这些单位有什么区别?
    Android中Application类用法
    Android中SharedPreferences用法
    Android中SQLite用法
    SQLite应用实例
    Android中Parcelable接口用法
    iOS block 基本用法及代替代理
    Xcode插件
  • 原文地址:https://www.cnblogs.com/cdoneiX/p/13039946.html
Copyright © 2020-2023  润新知