工作紀實_03_短時間內禁止重複提交

需求

​ 對於某些情況下,存在前端雙擊請求後臺的操作,雖然前端也可以做到限制,但是保險起見還是要對後臺的雙擊進行判斷

難點

​ 傳統情況下的雙擊防護,都是依賴於數據庫的查詢後插入,但是對於每個接口都加上的話,太重了一些

說明

​ 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+數據庫插入判斷雙重保障數據入庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章