乐鱼官方端网站登录入口-乐鱼leyu(中国)

乐鱼官方端网站登录入口-乐鱼leyu(中国)

网站应(yīng)用程(chéng)序防止数据重复提(tí)交(jiāo)

发布于: 2025-07-07    浏览: 40    作者:系统管理员

一、前(qián)端防(fáng)护策略(luè)(减少无(wú)效请求)

1.按钮禁用与状态反馈

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

this.disabled = true;

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

});

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

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

let isSubmitting = false;functionsubmitForm() {

if (isSubmitting) return;    

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

}

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

3.异步提(tí)交 + Loading提示

·使用Ajax提交数据,配合模态框或进度条增强用户体验:

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

 e.preventDefault();    

$("#loadingModal").show(); // 显示加载提(tí)示    

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

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

});

});



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

1.Token令牌机制

·流程:生成页面时创建唯一Token(如(rú)GUID)存入Session,嵌(qiàn)入表单隐(yǐn)藏(cáng)域;提交时(shí)校验Token有效(xiào)性并立即销毁。


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

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

Session["SubmitToken"] = token;    

ViewBag.Token = token; // 传递到视(shì)图(tú)

}
[HttpPost]

public ActionResult SubmitForm(FormModel model, string token){

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

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

}

·优势:有效防御刷新、后(hòu)退(tuì)导致的重复提交


2.幂等键(Idempotency Key)

·客户端生(shēng)成唯一Key(如GUID)放入请求头,服务端通过(guò)缓存(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.重(chóng)定(dìng)向模式(PRG: Post-Redirect-Get)

·提交(jiāo)成功后返回302重定向至结(jié)果页(yè),刷新时(shí)仅(jǐn)重发(fā)GET请求,避(bì)免重(chóng)复POST。


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

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

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

ALTERTABLE Orders ADDUNIQUE (OrderNumber);



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

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

// Redis锁示例

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

redisLock.ReleaseLock();

}


3.操作状态(tài)校(xiào)验

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

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



总结

·基础方案:前端按钮禁用(yòng) + 后端Token校验(覆(fù)盖90%场景(jǐng))

·高可(kě)靠场(chǎng)景:补充数据库唯一索引与Redis分布式锁

·用户体验优(yōu)化:加载动画与(yǔ)防(fáng)抖减少用户焦虑性点击





在线(xiàn)客服

售前咨(zī)询

售后服务

投(tóu)诉/建(jiàn)议(yì)

服务热线
0731-83091505
18874148081

乐鱼官方端网站登录入口-乐鱼leyu(中国)

乐鱼官方端网站登录入口-乐鱼leyu(中国)