九游平台-九游(中国)一站式服务平台



    九游平台-九游(中国)一站式服务平台

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

    发布(bù)于: 2025-07-07    浏览: 59    作(zuò)者:系统管(guǎn)理员

    一、前端(duān)防(fáng)护策略(减(jiǎn)少无(wú)效请求)

    1.按钮(niǔ)禁用与状态反馈

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

    this.disabled = true;

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

    });

    2.防抖(dǒu)(Debounce)与请(qǐng)求(qiú)锁

    ·通过标志位或定时器(qì)限制短时间内的重复(fù)提交(jiāo):

    let isSubmitting = false;functionsubmitForm() {

    if (isSubmitting) return;    

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

    }

    ·框架(jià)中(zhōng)可(kě)使用lodash.debounce优化

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

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

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

     e.preventDefault();    

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

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

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

    });

    });



    二(èr)、后端幂等性控制(核心防御(yù))

    1.Token令牌机制

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


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

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

    Session["SubmitToken"] = token;    

    ViewBag.Token = token; // 传(chuán)递到视图

    }
    [HttpPost]

    public ActionResult SubmitForm(FormModel model, string token){

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

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

    }

    ·优势:有效防(fáng)御刷新、后退(tuì)导致的重(chóng)复提交


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

    ·客户(hù)端生(shēng)成唯一Key(如GUID)放入(rù)请(qǐng)求头,服务(wù)端通过缓(huǎn)存(Redis/MemoryCache)校(xiào)验(yàn):

    // ASP.NET Core 过滤器示例(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.重定(dìng)向模式(PRG: Post-Redirect-Get)

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


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

    1.数据库唯一约束

    ·为业务(wù)关键字段(如(rú)订(dìng)单号、用户邮(yóu)箱)添加唯(wéi)一索引,从底层阻(zǔ)止重复数据(jù):

    ALTERTABLE Orders ADDUNIQUE (OrderNumber);



    2.分布式锁(Redis)

    ·以“用户ID + 操(cāo)作类型”为Key加锁,确保并发请求仅一个生(shēng)效:

    // Redis锁(suǒ)示例

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

    redisLock.ReleaseLock();

    }


    3.操作状态校验

    ·更新(xīn)数据(jù)前(qián)检(jiǎn)查(chá)状态(如订单是否已(yǐ)处(chù)理),避免重(chóng)复更新(xīn):

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



    总结

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

    ·高可靠场(chǎng)景:补充数(shù)据库唯(wéi)一索引与(yǔ)Redis分布式锁

    ·用户体验优化:加载动(dòng)画与(yǔ)防抖减少用户焦虑性点(diǎn)击





    在线(xiàn)客服

    九游平台-九游(中国)一站式服务平台

    九游平台-九游(中国)一站式服务平台