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;
}

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM