疯狂的狮子Li
2022-03-03 56feff0455f33e8ef7b4d0429792a82413fcc98b
update 优化 RepeatSubmit 注解 支持业务处理失败 与 异常快速放行
已修改1个文件
37 ■■■■■ 文件已修改
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java
@@ -5,6 +5,7 @@
import cn.hutool.crypto.SecureUtil;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.JsonUtils;
import com.ruoyi.common.utils.ServletUtils;
@@ -14,6 +15,8 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@@ -27,7 +30,7 @@
import java.util.concurrent.TimeUnit;
/**
 * 防止重复提交
 * 防止重复提交(参考美团GTIS防重系统)
 *
 * @author Lion Li
 */
@@ -36,6 +39,8 @@
@Aspect
@Component
public class RepeatSubmitAspect {
    private static final ThreadLocal<String> KEY_CACHE = new ThreadLocal<>();
    private final RepeatSubmitProperties repeatSubmitProperties;
@@ -64,12 +69,42 @@
        String key = RedisUtils.getCacheObject(cacheRepeatKey);
        if (key == null) {
            RedisUtils.setCacheObject(cacheRepeatKey, "", interval, TimeUnit.MILLISECONDS);
            KEY_CACHE.set(cacheRepeatKey);
        } else {
            throw new ServiceException(repeatSubmit.message());
        }
    }
    /**
     * 处理完请求后执行
     *
     * @param joinPoint 切点
     */
    @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) {
        if (jsonResult instanceof R) {
            R<?> r = (R<?>) jsonResult;
            if (r.getCode() == R.SUCCESS) {
                return;
            }
            RedisUtils.deleteObject(KEY_CACHE.get());
            KEY_CACHE.remove();
        }
    }
    /**
     * 拦截异常操作
     *
     * @param joinPoint 切点
     * @param e         异常
     */
    @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) {
        RedisUtils.deleteObject(KEY_CACHE.get());
        KEY_CACHE.remove();
    }
    /**
     * 参数拼装
     */
    private String argsArrayToString(Object[] paramsArray) {