乐鱼手机站入口-乐鱼online(中国)

  • 乐鱼手机站入口-乐鱼online(中国)

    网站(zhàn)应用程序防(fáng)止数据重复提交(jiāo)

    发布于: 2025-07-07    浏览: 38    作者:系统管理员

    一、前端防护策略(减少无效请求)

    1.按钮禁用与状态反馈

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

    this.disabled = true;

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

    });

    2.防抖(dǒu)(Debounce)与请求锁(suǒ)

    ·通过标志位(wèi)或定时器限制短时间内的重复提交:

    let isSubmitting = false;functionsubmitForm() {

    if (isSubmitting) return;    

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

    }

    ·框架中可使(shǐ)用lodash.debounce优化

    3.异步提交 + Loading提示(shì)

    ·使(shǐ)用(yòng)Ajax提交数据(jù),配合模态框或进度条增强用(yòng)户(hù)体验:

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

     e.preventDefault();    

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

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

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

    });

    });



    二、后端幂(mì)等性控制(核心防御)

    1.Token令牌机制

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


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

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

    Session["SubmitToken"] = token;    

    ViewBag.Token = token; // 传递到视(shì)图

    }
    [HttpPost]

    public ActionResult SubmitForm(FormModel model, string token){

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

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

    }

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


    2.幂等键(Idempotency Key)

    ·客(kè)户(hù)端生成唯一Key(如GUID)放入请(qǐng)求头,服务端(duān)通过缓存(Redis/MemoryCache)校验:

    // ASP.NET Core 过滤器(qì)示例

    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)

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


     三、数据库与架构层防护

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

    ·为业务关键字段(如订单号、用户邮箱(xiāng))添加(jiā)唯一(yī)索(suǒ)引,从底层阻止重复(fù)数据(jù):

    ALTERTABLE Orders ADDUNIQUE (OrderNumber);



    2.分布式锁(suǒ)(Redis)

    ·以“用户ID + 操作(zuò)类型(xíng)”为Key加锁,确保并发请求仅一个生效:

    // Redis锁(suǒ)示例

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

    redisLock.ReleaseLock();

    }


    3.操作状态校(xiào)验

    ·更新数据前检查状态(如订单是否(fǒu)已处理(lǐ)),避免重(chóng)复更新:

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



    总(zǒng)结

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

    ·高可(kě)靠(kào)场(chǎng)景:补(bǔ)充数据库唯一索(suǒ)引(yǐn)与Redis分(fèn)布式锁

    ·用户体验优化:加载动画与(yǔ)防抖(dǒu)减少用户(hù)焦虑性点击





    在线客服

    售前(qián)咨(zī)询

    售(shòu)后服务

    投诉/建议

    服务热线
    0731-83091505
    18874148081

    乐鱼手机站入口-乐鱼online(中国)

    乐鱼手机站入口-乐鱼online(中国)