Ver Fonte

优化接口版本控制拦截逻辑

woody há 4 meses atrás
pai
commit
f7b6515517

+ 0 - 59
framework-base/src/main/java/com/chelvc/framework/base/interceptor/ControllerAccessInterceptor.java

@@ -1,17 +1,7 @@
 package com.chelvc.framework.base.interceptor;
 
-import java.lang.reflect.Method;
-
 import ch.qos.logback.classic.Level;
-import com.chelvc.framework.base.annotation.Version;
-import com.chelvc.framework.base.annotation.Versions;
-import com.chelvc.framework.base.context.ApplicationContextHolder;
 import com.chelvc.framework.base.context.LoggingContextHolder;
-import com.chelvc.framework.base.context.SessionContextHolder;
-import com.chelvc.framework.common.exception.ResourceUnavailableException;
-import com.chelvc.framework.common.model.Terminal;
-import com.chelvc.framework.common.util.ObjectUtils;
-import com.chelvc.framework.common.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -22,7 +12,6 @@ import org.aspectj.lang.reflect.MethodSignature;
 import org.springframework.boot.web.servlet.error.ErrorController;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
-import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 
@@ -54,53 +43,6 @@ public class ControllerAccessInterceptor {
                 && LoggingContextHolder.level(signature.getDeclaringTypeName()) == Level.DEBUG;
     }
 
-    /**
-     * 检查终端版本号
-     *
-     * @param point 接口方法拦截点
-     */
-    private void checkVersion(JoinPoint point) {
-        Signature signature = point.getSignature();
-        if (!(signature instanceof MethodSignature)) {
-            return;
-        }
-
-        Terminal terminal = SessionContextHolder.getTerminal();
-        if (terminal == null) {
-            return;
-        }
-
-        // 接口方法/类版本注解校验
-        Method method = ((MethodSignature) signature).getMethod();
-        Version[] versions = ObjectUtils.ifNull(method.getAnnotation(Versions.class), Versions::value);
-        if (ObjectUtils.isEmpty(versions)) {
-            Class<?> declaring = signature.getDeclaringType();
-            versions = ObjectUtils.ifNull(declaring.getAnnotation(Versions.class), Versions::value);
-        }
-        if (ObjectUtils.notEmpty(versions)) {
-            Environment environment = ApplicationContextHolder.getEnvironment(false);
-            for (Version version : versions) {
-                if (version.terminal() == terminal && StringUtils.notEmpty(version.value())
-                        && !SessionContextHolder.isVersion(version)) {
-                    String message = version.message();
-                    if (environment != null && StringUtils.notEmpty(message)) {
-                        message = environment.resolvePlaceholders(message);
-                    }
-                    if (StringUtils.isEmpty(message)) {
-                        message = ApplicationContextHolder.getMessage("Version.Control.Limit");
-                    }
-                    throw new ResourceUnavailableException(message);
-                }
-            }
-        }
-
-        // 终端最低版本配置校验
-        String minimum = ApplicationContextHolder.getProperty(terminal.name().toLowerCase() + ".version.minimum");
-        if (StringUtils.notEmpty(minimum) && !SessionContextHolder.isAfterVersion(terminal, minimum, true)) {
-            throw new ResourceUnavailableException(ApplicationContextHolder.getMessage("Version.Control.Limit"));
-        }
-    }
-
     /**
      * 接口请求日志打印
      *
@@ -114,7 +56,6 @@ public class ControllerAccessInterceptor {
         if (debug) {
             LoggingContextHolder.debug(log, point.getArgs());
         }
-        this.checkVersion(point);
         Object value = point.proceed();
         if (debug) {
             LoggingContextHolder.debug(log, value);

+ 77 - 0
framework-base/src/main/java/com/chelvc/framework/base/interceptor/VersionControlInterceptor.java

@@ -0,0 +1,77 @@
+package com.chelvc.framework.base.interceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.chelvc.framework.base.annotation.Version;
+import com.chelvc.framework.base.annotation.Versions;
+import com.chelvc.framework.base.context.ApplicationContextHolder;
+import com.chelvc.framework.base.context.SessionContextHolder;
+import com.chelvc.framework.common.exception.ResourceUnavailableException;
+import com.chelvc.framework.common.model.Terminal;
+import com.chelvc.framework.common.util.ObjectUtils;
+import com.chelvc.framework.common.util.StringUtils;
+import org.springframework.core.Ordered;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 接口版本控制拦截器
+ *
+ * @author Woody
+ * @date 2024/12/18
+ */
+@Component
+public class VersionControlInterceptor implements HandlerInterceptor, WebMvcConfigurer {
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
+            throws Exception {
+        if (!(handler instanceof HandlerMethod)) {
+            return true;
+        }
+
+        Terminal terminal = SessionContextHolder.getTerminal();
+        if (terminal == null) {
+            return true;
+        }
+
+        // 接口方法/类版本注解校验
+        HandlerMethod method = (HandlerMethod) handler;
+        Version[] versions = ObjectUtils.ifNull(method.getMethodAnnotation(Versions.class), Versions::value);
+        if (ObjectUtils.isEmpty(versions)) {
+            versions = ObjectUtils.ifNull(method.getBeanType().getAnnotation(Versions.class), Versions::value);
+        }
+        if (ObjectUtils.notEmpty(versions)) {
+            Environment environment = ApplicationContextHolder.getEnvironment(false);
+            for (Version version : versions) {
+                if (version.terminal() == terminal && StringUtils.notEmpty(version.value())
+                        && !SessionContextHolder.isVersion(version)) {
+                    String message = version.message();
+                    if (environment != null && StringUtils.notEmpty(message)) {
+                        message = environment.resolvePlaceholders(message);
+                    }
+                    if (StringUtils.isEmpty(message)) {
+                        message = ApplicationContextHolder.getMessage("Version.Control.Limit");
+                    }
+                    throw new ResourceUnavailableException(message);
+                }
+            }
+        }
+
+        // 终端最低版本配置校验
+        String minimum = ApplicationContextHolder.getProperty(terminal.name().toLowerCase() + ".version.minimum");
+        if (StringUtils.notEmpty(minimum) && !SessionContextHolder.isAfterVersion(terminal, minimum, true)) {
+            throw new ResourceUnavailableException(ApplicationContextHolder.getMessage("Version.Control.Limit"));
+        }
+        return true;
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(this).addPathPatterns("/**").order(Ordered.LOWEST_PRECEDENCE);
+    }
+}