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





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

    网站应用程序(xù)防止(zhǐ)数(shù)据重复提交(jiāo)

    发布于: 2025-07-07    浏览: 43    作者:系统管理员(yuán)

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

    1.按钮禁用与状态反馈

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

    this.disabled = true;

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

    });

    2.防抖(Debounce)与请求(qiú)锁

    ·通过标志位或定时(shí)器限制短时间内的(de)重复(fù)提交:

    let isSubmitting = false;functionsubmitForm() {

    if (isSubmitting) return;    

    isSubmitting = true;// 执行提交逻辑(jí)

    }

    ·框架中可使用lodash.debounce优化(huà)

    3.异步提交(jiāo) + Loading提示

    ·使用Ajax提交数据(jù),配(pèi)合模态框或(huò)进(jìn)度条增强用(yòng)户体验:

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

     e.preventDefault();    

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

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

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

    });

    });



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

    1.Token令牌(pái)机制

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


    // ASP.NET MVC 示例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("重复提交拒(jù)绝");    

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

    }

    ·优(yōu)势(shì):有效防御刷(shuā)新、后(hòu)退导(dǎo)致的重(chóng)复提交


    2.幂等键(jiàn)(Idempotency Key)

    ·客户端生成唯一(yī)Key(如GUID)放入(rù)请求头,服务端通(tōng)过缓存(cún)(Redis/MemoryCache)校验:

    // ASP.NET Core 过(guò)滤器示(shì)例(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)

    ·提交(jiāo)成功后返回(huí)302重定向至结果页,刷新时仅(jǐn)重发GET请求,避免(miǎn)重复POST。


     三、数据库与架构层防(fáng)护

    1.数据库唯(wéi)一约束

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

    ALTERTABLE Orders ADDUNIQUE (OrderNumber);



    2.分布(bù)式锁(Redis)

    ·以“用户ID + 操(cāo)作类(lèi)型”为Key加锁,确保并发请(qǐng)求仅(jǐn)一个生效:

    // Redis锁示例

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

    redisLock.ReleaseLock();

    }


    3.操作状态校验

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

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



    总(zǒng)结

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

    ·高(gāo)可靠场景:补充数据库唯一索引与Redis分布式(shì)锁

    ·用户体验优(yōu)化(huà):加载(zǎi)动画(huà)与防抖减(jiǎn)少用户焦(jiāo)虑性点击(jī)





    在线(xiàn)客(kè)服

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

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