贝博集团官网(中国)官方网站




    1. 贝博集团官网(中国)官方网站

      网站应用程(chéng)序(xù)防止数(shù)据重复提交

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

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

      1.按钮禁用与状态反馈(kuì)

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

      this.disabled = true;

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

      });

      2.防(fáng)抖(Debounce)与(yǔ)请求锁

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

      let isSubmitting = false;functionsubmitForm() {

      if (isSubmitting) return;    

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

      }

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

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

      ·使用Ajax提交数(shù)据,配合(hé)模态框(kuàng)或(huò)进度条(tiáo)增强用户(hù)体验:

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

       e.preventDefault();    

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

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

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

      });

      });



      二、后端幂等性(xìng)控制(核心防御(yù))

      1.Token令牌机制

      ·流程:生成(chéng)页面时(shí)创建唯一Token(如GUID)存(cún)入Session,嵌入表单隐(yǐn)藏域(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");// 处理业务

      }

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


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

      ·客户(hù)端生成唯一Key(如GUID)放入(rù)请求头(tóu),服务端通(tōng)过缓存(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)

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


       三、数据库与架构层防护

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

      ·为业务(wù)关键字段(如订单号(hào)、用(yòng)户邮箱)添(tiān)加(jiā)唯一索(suǒ)引(yǐn),从底层阻止(zhǐ)重复数据:

      ALTERTABLE Orders ADDUNIQUE (OrderNumber);



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

      ·以“用户(hù)ID + 操作类型”为Key加锁(suǒ),确保并发请求仅一(yī)个(gè)生效:

      // Redis锁示例

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

      redisLock.ReleaseLock();

      }


      3.操(cāo)作状态校验

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

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



      总(zǒng)结

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

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

      ·用户体验(yàn)优化:加载动画与防抖减(jiǎn)少用户焦虑性点击





      在线客服

      售前咨询

      售后服务(wù)

      投诉/建议

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

      贝博集团官网(中国)官方网站

      贝博集团官网(中国)官方网站