需求
对于某些情况下,存在前端双击请求后台的操作,虽然前端也可以做到限制,但是保险起见还是要对后台的双击进行判断
难点
传统情况下的双击防护,都是依赖于数据库的查询后插入,但是对于每个接口都加上的话,太重了一些
说明
ERP的某些数据,只能存在一条,但是双击会破坏这种数据结构,产生无法预测的异常
项目环境
3个服务一同运行,共享一个reids服务器
解决思路
利用redis对用户的提交做提交间隔判断,一定时间内不允许提交多次
核心代码
@Autowired
private StringRedisTemplate stringRedisTemplate;
@PostMapping("/create")
public JsonResult creat(@Validated @RequestBody ActualMessageDto actualMessageDto) {
// 一定时间内不允许多次提交
if (sendWait(actualMessageDto.getGroupId())) {
throw new GroupAuditException(FINAL_ACCOUNTS_HAVE_ADOPTED);
}
this.actualBudgetApprovalService.approvalFinalBudgetInfo(actualMessageDto);
return JsonResult.ok();
}
private boolean sendWait(String key) {
String keyRedis = ACTUAL_APPROVAL + key;
BoundValueOperations<String, String> opts = stringRedisTemplate.boundValueOps(keyRedis);
String value = opts.get();
if (StringUtils.isNotEmpty(value)) {
return true;
}
opts.setIfAbsent("0");
opts.expire(5, TimeUnit.SECONDS);
return false;
}
在某些重要操作上,最好是redis+数据库插入判断双重保障数据入库