需求
對於某些情況下,存在前端雙擊請求後臺的操作,雖然前端也可以做到限制,但是保險起見還是要對後臺的雙擊進行判斷
難點
傳統情況下的雙擊防護,都是依賴於數據庫的查詢後插入,但是對於每個接口都加上的話,太重了一些
說明
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+數據庫插入判斷雙重保障數據入庫