|
@@ -3,16 +3,16 @@ package org.jeecg.config.shiro.ignore;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.jeecg.config.shiro.IgnoreAuth;
|
|
|
-import org.springframework.aop.framework.Advised;
|
|
|
-import org.springframework.context.ApplicationContext;
|
|
|
-import org.springframework.context.ApplicationListener;
|
|
|
-import org.springframework.context.event.ContextRefreshedEvent;
|
|
|
+import org.springframework.beans.factory.InitializingBean;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
+import org.springframework.web.method.HandlerMethod;
|
|
|
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
|
|
|
|
|
|
import java.lang.reflect.Method;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 在spring boot初始化时,根据@RestController注解获取当前spring容器中的bean
|
|
@@ -22,24 +22,20 @@ import java.util.*;
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
@AllArgsConstructor
|
|
|
-public class IgnoreAuthPostProcessor implements ApplicationListener<ContextRefreshedEvent> {
|
|
|
+public class IgnoreAuthPostProcessor implements InitializingBean {
|
|
|
+
|
|
|
+ private RequestMappingHandlerMapping requestMappingHandlerMapping;
|
|
|
|
|
|
- private ApplicationContext applicationContext;
|
|
|
|
|
|
@Override
|
|
|
- public void onApplicationEvent(ContextRefreshedEvent event) {
|
|
|
+ public void afterPropertiesSet() throws Exception {
|
|
|
+
|
|
|
long startTime = System.currentTimeMillis();
|
|
|
|
|
|
List<String> ignoreAuthUrls = new ArrayList<>();
|
|
|
- if (event.getApplicationContext().getParent() == null) {
|
|
|
- // 只处理根应用上下文的事件,避免在子上下文中重复处理
|
|
|
- Map<String, Object> restControllers = applicationContext.getBeansWithAnnotation(RestController.class);
|
|
|
- for (Object restController : restControllers.values()) {
|
|
|
- // 如 online系统的controller并不是spring 默认生成
|
|
|
- if (restController instanceof Advised) {
|
|
|
- ignoreAuthUrls.addAll(postProcessRestController(restController));
|
|
|
- }
|
|
|
- }
|
|
|
+ Set<Class<?>> restControllers = requestMappingHandlerMapping.getHandlerMethods().values().stream().map(HandlerMethod::getBeanType).collect(Collectors.toSet());
|
|
|
+ for (Class<?> restController : restControllers) {
|
|
|
+ ignoreAuthUrls.addAll(postProcessRestController(restController));
|
|
|
}
|
|
|
|
|
|
log.info("Init Token ignoreAuthUrls Config [ 集合 ] :{}", ignoreAuthUrls);
|
|
@@ -53,9 +49,8 @@ public class IgnoreAuthPostProcessor implements ApplicationListener<ContextRefre
|
|
|
log.info("Init Token ignoreAuthUrls Config [ 耗时 ] :" + elapsedTime + "毫秒");
|
|
|
}
|
|
|
|
|
|
- private List<String> postProcessRestController(Object restController) {
|
|
|
+ private List<String> postProcessRestController(Class<?> clazz) {
|
|
|
List<String> ignoreAuthUrls = new ArrayList<>();
|
|
|
- Class<?> clazz = ((Advised) restController).getTargetClass();
|
|
|
RequestMapping base = clazz.getAnnotation(RequestMapping.class);
|
|
|
String[] baseUrl = Objects.nonNull(base) ? base.value() : new String[]{};
|
|
|
Method[] methods = clazz.getDeclaredMethods();
|