一、前端防护策略(减少无效请求)
	1.按钮禁用与状态反馈
	·点击后立即禁用按钮,阻止二次点击,并添加加载动画提示用户:document.getElementById("btnSubmit").addEventListener("click", function() {
	this.disabled = true;
	this.classList.add("loading-spinner"); // 添加加载样式
	});
	2.防抖(Debounce)与请求锁
	·通过标志位或定时器限制短时间内的重复提交:
	let isSubmitting = false;functionsubmitForm() {
	if (isSubmitting) return;    
	isSubmitting = true;// 执行提交逻辑
	}
	·框架中可使用lodash.debounce优化
	3.异步提交 + Loading提示
	·使用Ajax提交数据,配合模态框或进度条增强用户体验:
	printf("hello world!");$("#form").submit(function(e) {   
	 e.preventDefault();    
	$("#loadingModal").show(); // 显示加载提示    
	$.post("/submit", $(this).serialize(), function() {        
	$("#loadingModal").hide();    
	});
	});
	
	
	二、后端幂等性控制(核心防御)
	1.Token令牌机制
	·流程:生成页面时创建唯一Token(如GUID)存入Session,嵌入表单隐藏域;提交时校验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("重复提交拒绝");    
	Session.Remove("SubmitToken");// 处理业务
	}
	·优势:有效防御刷新、后退导致的重复提交
	
	2.幂等键(Idempotency Key)
	·客户端生成唯一Key(如GUID)放入请求头,服务端通过缓存(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)
	·提交成功后返回302重定向至结果页,刷新时仅重发GET请求,避免重复POST。
	
	 三、数据库与架构层防护
	1.数据库唯一约束
	·为业务关键字段(如订单号、用户邮箱)添加唯一索引,从底层阻止重复数据:
ALTERTABLE Orders ADDUNIQUE (OrderNumber);
	
	
	2.分布式锁(Redis) 
	·以“用户ID + 操作类型”为Key加锁,确保并发请求仅一个生效: 
	// Redis锁示例 
	if (redisLock.AcquireLock(userId + "_submit", TimeSpan.FromSeconds(10))){        
	redisLock.ReleaseLock();
	}
	
	3.操作状态校验 
	·更新数据前检查状态(如订单是否已处理),避免重复更新: 
	UPDATE Orders SET Status ='Paid'WHERE Id =100AND Status ='Pending';
	
	
	总结 
	·基础方案:前端按钮禁用 + 后端Token校验(覆盖90%场景) 
	·高可靠场景:补充数据库唯一索引与Redis分布式锁 
	·用户体验优化:加载动画与防抖减少用户焦虑性点击