疯狂的狮子li
2021-10-20 82f1f5d0cf1b51a5d81915e842e01760f404fa74
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java
@@ -14,16 +14,12 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
/**
 * 防止重复提交
@@ -40,20 +36,14 @@
    private final RepeatSubmitProperties repeatSubmitProperties;
    private final LockTemplate lockTemplate;
    // 配置织入点
    @Pointcut("@annotation(com.ruoyi.common.annotation.RepeatSubmit)")
    public void repeatSubmitPointCut() {
    }
    @Before("repeatSubmitPointCut()")
    public void doBefore(JoinPoint point) throws Throwable {
        RepeatSubmit repeatSubmit = getAnnotationRateLimiter(point);
    @Before("@annotation(repeatSubmit)")
    public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable {
        // 如果注解不为0 则使用注解数值
        long intervalTime = repeatSubmitProperties.getIntervalTime();
        if (repeatSubmit.intervalTime() > 0) {
            intervalTime = repeatSubmit.timeUnit().toMillis(repeatSubmit.intervalTime());
        long interval = repeatSubmitProperties.getInterval();
        if (repeatSubmit.interval() > 0) {
            interval = repeatSubmit.timeUnit().toMillis(repeatSubmit.interval());
        }
        if (intervalTime < 1000) {
        if (interval < 1000) {
            throw new ServiceException("重复提交间隔时间不能小于'1'秒");
        }
        HttpServletRequest request = ServletUtils.getRequest();
@@ -70,24 +60,10 @@
        submitKey = SecureUtil.md5(submitKey + ":" + nowParams);
        // 唯一标识(指定key + 消息头)
        String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + submitKey;
        LockInfo lock = lockTemplate.lock(cacheRepeatKey, intervalTime, intervalTime / 2);
        LockInfo lock = lockTemplate.lock(cacheRepeatKey, interval, interval / 2);
        if (lock == null) {
            throw new ServiceException("不允许重复提交,请稍后再试!");
            throw new ServiceException(repeatSubmit.message());
        }
    }
    /**
     * 是否存在注解,如果存在就获取
     */
    private RepeatSubmit getAnnotationRateLimiter(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        if (method != null) {
            return method.getAnnotation(RepeatSubmit.class);
        }
        return null;
    }
}