Pārlūkot izejas kodu

防重复提交优化

tudc 3 gadi atpakaļ
vecāks
revīzija
609dfb3468

+ 4 - 0
sc-service/src/main/java/com/huyi/service/annotation/Repeat.java

@@ -5,7 +5,11 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * @author tianhu
+ */
 @Target({ElementType.TYPE, ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Repeat {
+    public long timeOut() default 10L;
 }

+ 49 - 19
sc-service/src/main/java/com/huyi/service/aspect/RepeatAspect.java

@@ -1,19 +1,24 @@
 package com.huyi.service.aspect;
 
+import com.huyi.service.annotation.Repeat;
 import com.tianhu.common.core.exception.RepeatException;
 import com.tianhu.common.core.utils.DateUtils;
 import com.tianhu.common.core.utils.ServletUtils;
 import com.tianhu.common.core.utils.StringUtils;
 import com.tianhu.common.redis.service.RedisService;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
 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.aspectj.lang.reflect.MethodSignature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.lang.reflect.Method;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -26,39 +31,64 @@ public class RepeatAspect {
 
     private static final Logger log = LoggerFactory.getLogger(com.huyi.service.aspect.RepeatAspect.class);
     private static final String REPEAT_TOKEN = "repeatToken";
-    private static final Long TIME_OUT = 15L;
 
     @Autowired
     private RedisService redisService;
 
     @Before("@annotation(com.huyi.service.annotation.Repeat)")
-    public void repeatBefore() {
-        String repeatToken = ServletUtils.getParameter(REPEAT_TOKEN);
-        if (StringUtils.isEmpty(repeatToken)) {
-            throw new RepeatException("repeatToken 不可为空!");
-        }
-        String redisValue = redisService.getCacheObject(REPEAT_TOKEN + repeatToken);
+    public void repeatBefore(JoinPoint joinPoint) {
+        // 获得注解
+        Signature signature = joinPoint.getSignature();
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = methodSignature.getMethod();
+        if (method != null)
+        {
+            Repeat repeat = method.getAnnotation(Repeat.class);
+            long timeout = repeat.timeOut();
+            String repeatToken = ServletUtils.getRequest().getHeader(REPEAT_TOKEN);
+            if (StringUtils.isEmpty(repeatToken)) {
+                throw new RepeatException("repeatToken 不可为空!");
+            }
+            String redisValue = redisService.getCacheObject(REPEAT_TOKEN + repeatToken);
 
-        if (!StringUtils.isEmpty(redisValue)) {
-            log.info(ServletUtils.getRequest().getRequestURI() + "重复提交! repeatToken : 【" + repeatToken + "】");
-            throw new RepeatException();
+            if (!StringUtils.isEmpty(redisValue)) {
+                log.info(ServletUtils.getRequest().getRequestURI() + "重复提交! repeatToken : 【" + repeatToken + "】");
+                throw new RepeatException("请勿重复提交");
+            }
+            redisService.setCacheObject(REPEAT_TOKEN + repeatToken, DateUtils.getTime(), timeout, TimeUnit.SECONDS);
         }
-        redisService.setCacheObject(REPEAT_TOKEN + repeatToken, DateUtils.getTime(), TIME_OUT, TimeUnit.SECONDS);
     }
 
     @AfterReturning("@annotation(com.huyi.service.annotation.Repeat)")
-    public void repeatRequestAfterReturning() throws Throwable {
-        String repeatToken = ServletUtils.getParameter("repeatToken");
-        if (!StringUtils.isEmpty(repeatToken)) {
-            redisService.setCacheObject(REPEAT_TOKEN + repeatToken, null, TIME_OUT, TimeUnit.SECONDS);
+    public void repeatRequestAfterReturning(JoinPoint joinPoint) throws Throwable {
+        // 获得注解
+        Signature signature = joinPoint.getSignature();
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = methodSignature.getMethod();
+        if (method != null)
+        {
+            Repeat repeat = method.getAnnotation(Repeat.class);
+            long timeout = repeat.timeOut();
+            String repeatToken = ServletUtils.getRequest().getHeader(REPEAT_TOKEN);
+            if (!StringUtils.isEmpty(repeatToken)) {
+                redisService.setCacheObject(REPEAT_TOKEN + repeatToken, null, timeout, TimeUnit.SECONDS);
+            }
         }
     }
 
     @AfterThrowing("@annotation(com.huyi.service.annotation.Repeat)")
-    public void repeatRequestAfterThrowing() {
-        String repeatToken = ServletUtils.getParameter("repeatToken");
-        if (!StringUtils.isEmpty(repeatToken)) {
-            redisService.setCacheObject(REPEAT_TOKEN + repeatToken, null, TIME_OUT, TimeUnit.SECONDS);
+    public void repeatRequestAfterThrowing(JoinPoint joinPoint) {
+        Signature signature = joinPoint.getSignature();
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = methodSignature.getMethod();
+        if (method != null)
+        {
+            Repeat repeat = method.getAnnotation(Repeat.class);
+            long timeout = repeat.timeOut();
+            String repeatToken = ServletUtils.getRequest().getHeader(REPEAT_TOKEN);
+            if (!StringUtils.isEmpty(repeatToken)) {
+                redisService.setCacheObject(REPEAT_TOKEN + repeatToken, null, timeout, TimeUnit.SECONDS);
+            }
         }
     }
 

+ 7 - 3
sc-service/src/main/java/com/huyi/service/controllerAdvice/MyGlobalExceptionHandler.java

@@ -2,16 +2,20 @@ package com.huyi.service.controllerAdvice;
 
 import com.tianhu.common.core.domain.R;
 import com.tianhu.common.core.exception.RepeatException;
+import com.tianhu.common.core.utils.StringUtils;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 @ControllerAdvice
 public class MyGlobalExceptionHandler {
-    @ExceptionHandler(RepeatException.class)
-    @ResponseBody
+
     public R customException(RepeatException e) {
         e.printStackTrace();
-        return R.fail("请勿重复提交!");
+        if (StringUtils.isEmpty(e.getDefaultMessage())) {
+            return R.fail("请勿重复提交!");
+        } else {
+            return R.fail(e.getDefaultMessage());
+        }
     }
 }