防重提交

DBC 1.6K 0

我们今天来学一个防重提交

温馨提示

这个功能博主之前有学习过 ,但是后面居然忘记了![aru_21] 现在赶紧把笔记做好,避免需要的时候急急忙忙。

首先不用说,Redis必须你得集成

SpringBoot2.x实战整合Redis客户端+单元测试

3年前 (2021-06-16) 0
防重提交插图

工具类

CommonUtil工具类

3年前 (2021-04-29) 0
防重提交插图2

上代码

    @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();
    }
温馨提示

我相信很简单,可以看得懂,这里还需要补充一些知识,也就是全局异常相关知识

微服务自定义全局异常+处理器handler开发

3年前 (2021-04-26) 0
防重提交插图4

顺便送一个枚举类吧 [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;
    }





}
温馨提示

大功告成,这里的token防重提交是有分布式的解决思想的,Lua脚本的原子操作,看不懂直接用就好啦 [aru_55]

发表评论 取消回复
表情 图片 链接 代码

分享