aop 幂等验证(二)

104 篇文章 3 订阅
87 篇文章 1 订阅

1 创建IIdempotent

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IIdempotent {
}

2 创建aop

@Component
@Aspect
public class IdempotentAction {

    public final static String ERROR_REPEATSUBMIT = "Repeated submission";

    //redis
    @Autowired
    protected StringRedisTemplate idempotentTemplate;

    //配置接入点,如果不知道怎么配置,可以百度一下规则
    @Pointcut("execution(* com.kps.webAPI*.controller..*.*(..))&&@annotation(com.kps.web.aop.Idempotent.IIdempotent)")
    private void controllerAspect() {
    }

    //成功处理请求
    @AfterReturning("controllerAspect()")
    public void AfterReturning(JoinPoint jp) throws Exception {
        IdempotentCheck(jp, ComContants.OP_RESULT[1]);
    }


    //后置异常通知
    @AfterThrowing("controllerAspect()")
    public void AfterThrowing(JoinPoint jp) throws Exception{
        IdempotentCheck(jp,ComContants.OP_RESULT[2]);
    }

    private void IdempotentCheck(JoinPoint jp, String opResult) throws Exception {
        String controllerName = jp.getTarget().getClass().getName();
        controllerName = controllerName.substring(controllerName.lastIndexOf(".") + 1);
        Signature sig = jp.getSignature();
        MethodSignature msig = (MethodSignature) sig;
        // 获得被拦截的方法
        Method method = msig.getMethod();
        // webUI控制器 @Controller注解
        IIdempotent systemlog = method.getAnnotation(IIdempotent.class);
        HttpServletRequest request = WebUtil.getHttpServletRequest();
        String body = NetUtil.getBodyString(request);
        String signMD5= MD5.md5(body);
        if (Boolean.parseBoolean(idempotentTemplate.opsForValue().get(signMD5))) {
            throw new ErrorSignException(ERROR_REPEATSUBMIT);
        } else {
            idempotentTemplate.opsForValue().set(signMD5, "true", ComContants.IDEMPOTENT_EXTIME, TimeUnit.SECONDS);
        }

    }
}

测试:

//幂等apo,测试实例,30秒不可重复提交相同数据
    @IIdempotent
    @RequestMapping(value = "test", method = RequestMethod.POST)
    public ApiResult<String> test(@RequestBody ApiRequest<String> requestVO) {
        ApiResult<String> r = new ApiResult<String>();
        r.setData(requestVO.getData());
        r.setCodeToSuccessed();
        return r;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值