我们今天来学一个防重提交
首先不用说,Redis必须你得集成
工具类
上代码
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 提交表单的token key
*/
public static final String SUBMIT_ORDER_TOKEN_KEY = "order:submit:%s"; 简单的两个接口
获取
@GetMapping("get_token")
public JsonData getOrderToken(int userId) {
String key = String.format(SUBMIT_ORDER_TOKEN_KEY, userId);
String token = CommonUtil.getStringNumRandom(32);
redisTemplate.opsForValue().set(key, token, 30, TimeUnit.MINUTES);
return JsonData.buildSuccess(token);
} 接收
@GetMapping("set_token")
public JsonData setOrderToken(int userId, String token) {
//原子操作 校验令牌,删除令牌
String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";
Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Arrays.asList(String.format(SUBMIT_ORDER_TOKEN_KEY, userId)), token);
if (result == 0L) {
throw new BizException(BizCodeEnum.ORDER_CONFIRM_TOKEN_EQUAL_FAIL);
}
return JsonData.buildSuccess();
} 顺便送一个枚举类吧 [aru_50]
import lombok.Getter;
public enum BizCodeEnum {
ORDER_CONFIRM_TOKEN_EQUAL_FAIL(-1,"订单令牌不正确"),
JV_SHUOMING(666666,"举例说明");
@Getter
private String message;
@Getter
private int code;
private BizCodeEnum(int code, String message){
this.code = code;
this.message = message;
}
}
本文作者为DBC,转载请注明。