zoukankan      html  css  js  c++  java
  • AOP实现防止接口重复提交

    项目中对于状态变更接口存在重复提交的问题。

    package com.yxx.survey.foundation.aop;
    
    import com.alibaba.fastjson.JSON;
    import com.yxx.survey.foundation.exception.ErrorEnum;
    import com.yxx.survey.foundation.exception.excetion.BusinessException;
    import com.yxx.survey.foundation.redis.RedisService;
    import com.yxx.survey.foundation.util.encryption.HashUtil;
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    
    
    @Aspect
    @Component
    @Slf4j
    public class RepeatSubmitAspect {
        @Resource
        private RedisService redisService;
    
        @Pointcut("@annotation(RepeatSubmitCheck)")
        public void requestPointcut() {
        }
    
        @Before("requestPointcut() && @annotation(repeatSubmitCheck)")
        public void aroundCheck(JoinPoint joinPoint, RepeatSubmitCheck repeatSubmitCheck) {
            String className = joinPoint.getTarget().getClass().getName();
    
            String methodName = joinPoint.getSignature().getName();
    
            Object[] args = joinPoint.getArgs();
            String paramsJsonStr = JSON.toJSONString(args);
    
            String srcStr = className + "_" + methodName + "_" + paramsJsonStr;
            log.info(srcStr);
    
            String signStr = HashUtil.MD5(srcStr);
    
            if (!redisService.setIfNotExists(signStr, "1", repeatSubmitCheck.keepSeconds())) {
                throw BusinessException.with(ErrorEnum.INTERFACE_INVOKE_FREQUENTLY);
            }
        }
    }
    package com.yxx.survey.foundation.aop;
    
    import java.lang.annotation.*;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface RepeatSubmitCheck {
        int keepSeconds() default 1;
    }

     

  • 相关阅读:
    如何获取公网IP
    v语言初体验
    利用python实现修改阿里云DNS值解析
    谈谈 ansible handlers
    使用dockerfile,创建gitblit镜像
    再谈docker基本命令
    使用tcpdump探测TCP/IP三次握手
    利用python list 完成最简单的DB连接池
    nginx报错:./configure: error: C compiler cc is not found, gcc 是已经安装了的
    探寻TP-Link路由器的登录验证
  • 原文地址:https://www.cnblogs.com/watson-ljf/p/10751990.html
Copyright © 2011-2022 走看看