在这里做两个限制
1.用户只发送了一次请求,但是因为网络问题或者其他各种各样的原因导致我们接收了两次所导致的重复提交
解决方案:提交时传入uuid,根据uuid是否相同来判断是否重复提交
try {
DoubleSubmitHelperEntity doubleEntity = new DoubleSubmitHelperEntity();
doubleEntity.setId("cash_audit"+uuid);
doubleEntity.setTime(new Date());
doubleSHMapper.save(doubleEntity);
} catch (Exception e) {
logger.info("【重复提交】:{}",param);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "uuid相同,重复提交";
}
以上代码逻辑:提交时将uuid作为主键存入库里,因为主键的特性,如果主键重复的话会出异常,会走catch中的代码块
2.用户短时间内提交次数过多导致的重复提交
解决方案:通过将该次操作的唯一标识作为key存入redis,如果在规定时间内该key依然存在的话则代表重复提交
String redisKey="multipleClicks_"+transferInfo.getUserId()+"_"+transferInfo.getId()+"_"+transferInfo.getBillId();
String redisValue=redisService.get(redisKey);
if("1".equals(redisValue)) {
logger.info("【重复提交】");
return "多次点击导致重复提交";
}
//120秒之后会自动消失
redisService.saveDataWithTime(redisKey,"1",120);
public void saveDataWithTime(String key,String value,long time){
redisTemplate.opsForValue().set(key, value);
if (time > 0) redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
以上代码逻辑:先获取该次操作的唯一标识以及相对应的值,如果在规定时间内(此处是120秒)redis的对应值为你存入的值,则代表该key存在,则代表重复提交