我们今天来学一个防重提交
首先不用说,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,转载请注明。