乐鱼网页版在线登录-leyu(中国)





乐鱼网页版在线登录-leyu(中国)

网站应用(yòng)程序防止数(shù)据重复提交

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

一(yī)、前端防(fáng)护策略(减(jiǎn)少无效请求)

1.按钮禁用与状态反馈

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

this.disabled = true;

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

});

2.防抖(Debounce)与请(qǐng)求锁

·通过标志位或定时器限制短时间内的重复提交:

let isSubmitting = false;functionsubmitForm() {

if (isSubmitting) return;    

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

}

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

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

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

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

 e.preventDefault();    

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

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

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

});

});



二、后端幂等性控制(核(hé)心防(fáng)御)

1.Token令牌机制

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


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

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

}

·优势:有效防御(yù)刷新、后退导致(zhì)的重复提交


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

·客户端(duān)生成唯(wéi)一(yī)Key(如GUID)放入请求头,服务端通过缓存(cún)(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.重定向(xiàng)模(mó)式(PRG: Post-Redirect-Get)

·提(tí)交成功后返回302重定向至结(jié)果(guǒ)页(yè),刷新(xīn)时仅重发GET请求,避免重复(fù)POST。


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

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

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

ALTERTABLE Orders ADDUNIQUE (OrderNumber);



2.分布式锁(Redis)

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

// Redis锁示(shì)例(lì)

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

redisLock.ReleaseLock();

}


3.操作状态校验

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

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



总结

·基(jī)础方案:前端按(àn)钮(niǔ)禁用 + 后(hòu)端(duān)Token校验(覆盖90%场(chǎng)景)

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

·用(yòng)户(hù)体验(yàn)优化:加载动画与防抖(dǒu)减少(shǎo)用户(hù)焦(jiāo)虑性点击





在线(xiàn)客服

售(shòu)前咨(zī)询

售后服务

投诉/建议

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

乐鱼网页版在线登录-leyu(中国)

乐鱼网页版在线登录-leyu(中国)