贵宾厅(中国区)官方网站

    贵宾厅(中国区)官方网站

    网站应用(yòng)程(chéng)序防止数据重复提交

    发布(bù)于: 2025-07-07    浏览: 56    作者:系(xì)统管理员

    一、前端防护策略(luè)(减少无效(xiào)请求)

    1.按钮禁用与状态(tài)反馈(kuì)

    ·点击后立即禁用按钮,阻(zǔ)止二次点击,并添加加载动画提示用户:document.getElementById("btnSubmit").addEventListener("click", function() {

    this.disabled = true;

    this.classList.add("loading-spinner"); // 添加加(jiā)载样式

    });

    2.防抖(Debounce)与请求锁

    ·通过标志位或定时(shí)器限制短(duǎn)时间内的重复提(tí)交:

    let isSubmitting = false;functionsubmitForm() {

    if (isSubmitting) return;    

    isSubmitting = true;// 执行提交逻辑

    }

    ·框架中可(kě)使用lodash.debounce优化

    3.异(yì)步提(tí)交 + Loading提示

    ·使用Ajax提(tí)交(jiāo)数据,配合模态框或(huò)进度条增(zēng)强(qiáng)用户体验:

    printf("hello world!");$("#form").submit(function(e) {   

     e.preventDefault();    

    $("#loadingModal").show(); // 显示加(jiā)载提示    

    $.post("/submit", $(this).serialize(), function() {        

    $("#loadingModal").hide();    

    });

    });



    二、后端幂等(děng)性控制(核心防(fáng)御)

    1.Token令牌机制(zhì)

    ·流程:生成页面(miàn)时创建(jiàn)唯一Token(如GUID)存入Session,嵌入表单隐藏域;提(tí)交(jiāo)时校验Token有效性并立即(jí)销毁。


    // ASP.NET MVC 示(shì)例public ActionResult SubmitForm(){

    string token = Guid.NewGuid().ToString();    

    Session["SubmitToken"] = token;    

    ViewBag.Token = token; // 传递到视图

    }
    [HttpPost]

    public ActionResult SubmitForm(FormModel model, string token){

    if (Session["SubmitToken"]?.ToString() != token) return Content("重复提交拒绝");    

    Session.Remove("SubmitToken");// 处理业务

    }

    ·优势:有效防御刷新、后退导致的重复提交


    2.幂等键(Idempotency Key)

    ·客(kè)户(hù)端生成唯一Key(如GUID)放入请求头,服(fú)务(wù)端通过缓(huǎn)存(cún)(Redis/MemoryCache)校验:

    // ASP.NET Core 过(guò)滤器示例

    publicclassIdempotencyFilter : IAsyncActionFilter{   

     public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){        

    var key = context.HttpContext.Request.Headers["Idempotency-Key"].FirstOrDefault();        if (_cache.TryGetValue(key, out _))    context.Result = new BadRequestResult();        

    else    _cache.Set(key, true, TimeSpan.FromMinutes(5));        

    await next();    

    }

    }


    3.重定向模式(shì)(PRG: Post-Redirect-Get)

    ·提交成功后(hòu)返回302重定(dìng)向至结果页(yè),刷新时仅重发GET请求,避免重复POST。


     三、数据库与架构层防护

    1.数据库唯一(yī)约束

    ·为业务关键字段(duàn)(如订(dìng)单号(hào)、用(yòng)户邮箱)添(tiān)加(jiā)唯一索引,从底层阻止(zhǐ)重复数据(jù):

    ALTERTABLE Orders ADDUNIQUE (OrderNumber);



    2.分(fèn)布式(shì)锁(suǒ)(Redis)

    ·以(yǐ)“用户ID + 操作类型”为Key加锁,确(què)保并发请求仅(jǐn)一个生效:

    // Redis锁示例

    if (redisLock.AcquireLock(userId + "_submit"TimeSpan.FromSeconds(10))){    // 执行业务    

    redisLock.ReleaseLock();

    }


    3.操(cāo)作(zuò)状(zhuàng)态校验

    ·更新数(shù)据前检查状态(tài)(如(rú)订单是否已处理),避免重复更新:

    UPDATE Orders SET Status ='Paid'WHERE Id =100AND Status ='Pending';



    总结(jié)

    ·基础方案(àn):前端按钮禁用 + 后端Token校验(覆盖(gài)90%场景)

    ·高可靠(kào)场景:补(bǔ)充(chōng)数据库唯一索引与Redis分布式锁

    ·用户体(tǐ)验(yàn)优化:加载动画与防(fáng)抖(dǒu)减(jiǎn)少用户(hù)焦虑性点击





    在线客服

    售前咨询

    售(shòu)后服务

    投(tóu)诉/建议

    服务热线
    0731-83091505
    18874148081

    贵宾厅(中国区)官方网站

    贵宾厅(中国区)官方网站

    相关信息

    "贵宾厅 沈阳贵宾厅进出口贸易有限公司沈阳贵宾厅进出口贸易有限公司成立于2016年,总部位于辽宁沈阳。公司致力于为生命科学领域研究者提供专业的科研工具及服务。公司拥有专业的售前、售后团队,建立以实验室设备销售为主体,集试剂、耗材销售、技术推广、售后服务、物流仓储为一体的综合型服务平台。

    更新时间:2025-07-18 06:18 来源:13020170768.en.linyi.liaocheng.jixi.ww38.viennacitytours.com