乐动网页版-乐动(中国)

  • 乐动网页版-乐动(中国)

    网(wǎng)站(zhàn)应用程序防止数据重复提交

    发布于: 2025-07-07    浏览: 48    作者:系统管(guǎn)理(lǐ)员

    一、前(qián)端防护策略(减少无效(xiào)请求)

    1.按(àn)钮禁用(yòng)与状(zhuàng)态反馈

    ·点击后立即禁用(yòng)按(àn)钮,阻止二(èr)次点击(jī),并添加加载动(dòng)画提示用户:document.getElementById("btnSubmit").addEventListener("click", function() {

    this.disabled = true;

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

    });

    2.防抖(Debounce)与请求锁

    ·通过标志(zhì)位或定(dìng)时(shí)器限制短时间内的重复提交:

    let isSubmitting = false;functionsubmitForm() {

    if (isSubmitting) return;    

    isSubmitting = true;// 执行(háng)提交逻辑

    }

    ·框架中可使用lodash.debounce优化

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

    ·使(shǐ)用Ajax提交(jiāo)数据,配合模态(tài)框或进(jìn)度条增强用户体(tǐ)验:

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

     e.preventDefault();    

    $("#loadingModal").show(); // 显示(shì)加载(zǎi)提(tí)示    

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

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

    });

    });



    二、后端幂等性控(kòng)制(核(hé)心防(fáng)御)

    1.Token令(lìng)牌机(jī)制

    ·流(liú)程:生成页(yè)面时创建唯(wéi)一(yī)Token(如GUID)存入Session,嵌入表单隐藏域;提交时校(xiào)验Token有效性并立即销毁。


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

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

    Session["SubmitToken"] = token;    

    ViewBag.Token = token; // 传递到视图(tú)

    }
    [HttpPost]

    public ActionResult SubmitForm(FormModel model, string token){

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

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

    }

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


    2.幂(mì)等键(Idempotency Key)

    ·客户端生(shēng)成唯一Key(如GUID)放(fàng)入请求头(tóu),服(fú)务端通过(guò)缓(huǎn)存(Redis/MemoryCache)校验(yàn):

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

    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.重定向模式(PRG: Post-Redirect-Get)

    ·提交成功后返回302重定向至结果页,刷新时仅(jǐn)重发(fā)GET请(qǐng)求(qiú),避免重(chóng)复POST。


     三、数(shù)据库与架构层防护

    1.数(shù)据库唯一约束

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

    ALTERTABLE Orders ADDUNIQUE (OrderNumber);



    2.分布式(shì)锁(Redis)

    ·以“用户ID + 操作类型”为Key加锁,确保并发(fā)请(qǐng)求(qiú)仅一个生效:

    // Redis锁示例(lì)

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

    redisLock.ReleaseLock();

    }


    3.操(cāo)作状态校(xiào)验(yàn)

    ·更新数据前检查状态(如订(dìng)单是否已处理),避免重复(fù)更新:

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



    总结

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

    ·高可靠场景:补充数据库唯一索引与Redis分布式锁(suǒ)

    ·用户体(tǐ)验(yàn)优化:加载动(dòng)画与防抖减少用户(hù)焦虑(lǜ)性点击





    在线客服

    售(shòu)前咨询

    售后服务

    投诉/建议

    服(fú)务热线
    0731-83091505
    18874148081

    乐动网页版-乐动(中国)

    乐动网页版-乐动(中国)