koko体育app官网入口(官方)APP下载IOS/Android通用版/手机app




    koko体育app官网入口(官方)APP下载IOS/Android通用版/手机app

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

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

    一、前(qián)端防护策(cè)略(减少无效请求)

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

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

    this.disabled = true;

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

    });

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

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

    let isSubmitting = false;functionsubmitForm() {

    if (isSubmitting) return;    

    isSubmitting = true;// 执行提交逻(luó)辑

    }

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

    3.异步(bù)提交 + Loading提示

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

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

     e.preventDefault();    

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

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

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

    });

    });



    二、后(hòu)端幂(mì)等(děng)性控制(核(hé)心防御)

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

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


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

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

    Session["SubmitToken"] = token;    

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

    }
    [HttpPost]

    public ActionResult SubmitForm(FormModel model, string token){

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

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

    }

    ·优势:有(yǒu)效(xiào)防御刷新、后退导致的重(chóng)复(fù)提交(jiāo)


    2.幂等键(Idempotency Key)

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

    // ASP.NET Core 过滤器示例

    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重定向至结果页,刷新时仅重发GET请求,避免重复(fù)POST。


     三、数据库与(yǔ)架构层防护

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

    ·为业(yè)务关键字段(duàn)(如订单号、用(yòng)户邮箱)添加唯(wéi)一索引,从底层阻止重复数据:

    ALTERTABLE Orders ADDUNIQUE (OrderNumber);



    2.分布式锁(Redis)

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

    // Redis锁示例

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

    redisLock.ReleaseLock();

    }


    3.操作状态校验

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

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



    总结

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

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

    ·用户体验优化(huà):加(jiā)载动(dòng)画与防抖减少用户焦虑性(xìng)点(diǎn)击(jī)





    在(zài)线客服

    售前咨询

    售后服(fú)务

    投诉/建议

    服务(wù)热(rè)线
    0731-83091505
    18874148081

    koko体育app官网入口(官方)APP下载IOS/Android通用版/手机app

    koko体育app官网入口(官方)APP下载IOS/Android通用版/手机app