工作纪实_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+数据库插入判断双重保障数据入库

发布了17 篇原创文章 · 获赞 4 · 访问量 3386

猜你喜欢

转载自blog.csdn.net/u013553309/article/details/100930568