最近在做项目中遇到一个接口由于用户“手抖”向库里插入了多条id不同其他字段相同的数据,未解决这个问题,查阅资料,整理此笔记,方便下次查看。
接口防抖处理是防止短时间内多次触发相同请求的一种技术手段,通常用于避免重复提交表单、重复点击按钮等场景。
在实现接口防抖可以通过以下几种方式:
1. 基于时间戳的防抖
通过记录请求的时间戳,判断两次请求的时间间隔是否小于某个阈值(如5秒)。如果小于阈值,则认为是重复请求并拒绝处理。
@PostMapping("/enterTheWarehouse")
public AjaxResult enterTheWarehouse(@Validated @RequestBody InWarehouseVO inWarehouseVO) {
// 使用请求参数生成唯一的 key
String key = "/enterTheWarehouse-" + inWarehouseVO.getAccountId();
// 获取当前时间戳
long currentTimestamp = System.currentTimeMillis();
log.info("当前时间戳:{}", currentTimestamp);
// 上一次请求的时间戳
Long lastTimestamp = requestTimestamps.get(key);
log.info("上一次请求时间戳:{}", lastTimestamp);
// 如果上一次请求时间不为空,并且与当前时间间隔小于5000毫秒(5秒),则认为是重复请求
if (lastTimestamp != null && currentTimestamp - lastTimestamp < 5000) {
return AjaxResult.error("重复提交,请稍后再试!");
}
// 记录当前请求时间戳
requestTimestamps.put(key, currentTimestamp);
this.storageToolService.enterTheWarehouse(inWarehouseVO);
return AjaxResult.success();
}
2. 基于令牌的防抖
在用户发起请求时,生成一个唯一的令牌(Token),并将该令牌存储在服务器端或客户端。每次请求时都需要携带这个令牌,服务器端通过验证令牌来判断是否是重复请求。
实现思路
- 生成令牌:在用户发起请求时,生成一个唯一的令牌(Token)。
- 存储令牌:将生成的令牌存储在服务器端(如内存、数据库或缓存)。
- 验证令牌:每次请求时,检查令牌