球速体育平台-球速(中国)



球速体育平台-球速(中国)

网站(zhàn)应用程(chéng)序防止数据重复提交

发布于: 2025-07-07    浏览: 37    作者:系统(tǒng)管理员

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

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

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

this.disabled = true;

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

});

2.防抖(Debounce)与请求锁

·通(tōng)过标志(zhì)位或定时器(qì)限制短时间内的重复提(tí)交:

let isSubmitting = false;functionsubmitForm() {

if (isSubmitting) return;    

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

}

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

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

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

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

 e.preventDefault();    

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

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

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

});

});



二、后端(duān)幂等性控制(核心防御)

1.Token令牌机制

·流程(chéng):生(shēng)成页面(miàn)时(shí)创建唯(wéi)一(yī)Token(如GUID)存入Session,嵌入表单隐(yǐn)藏域;提交时校验(yàn)Token有(yǒu)效性并(bìng)立即销毁。


// 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("重复提交拒绝");    

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

}

·优势:有效防御刷新、后退导致的重复(fù)提交(jiāo)


2.幂等键(Idempotency Key)

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

// ASP.NET Core 过滤器示(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)

·提交成功后(hòu)返回302重定向至结果页,刷新时仅重发GET请求,避(bì)免(miǎn)重复POST。


 三、数据库与架构层防护

1.数据库唯一约束

·为业务(wù)关键字段(如订单号、用户邮箱)添加唯一(yī)索引(yǐn),从底层阻止重复数(shù)据:

ALTERTABLE Orders ADDUNIQUE (OrderNumber);



2.分(fèn)布式锁(Redis)

·以“用户ID + 操作(zuò)类型”为Key加锁(suǒ),确(què)保并发请(qǐng)求仅一个生(shēng)效(xiào):

// Redis锁示例

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

redisLock.ReleaseLock();

}


3.操作状态校验

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

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



总结

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

·高可(kě)靠场景:补充数据库唯一(yī)索引(yǐn)与Redis分布式(shì)锁(suǒ)

·用(yòng)户(hù)体验(yàn)优化:加载动(dòng)画与防抖减少用户焦虑性(xìng)点击





在线客服

球速体育平台-球速(中国)

球速体育平台-球速(中国)