Skip to content

Commit 0e10d98

Browse files
authored
Merge pull request #551 from CC11001100/fix/multi-RequestMappingHandlerMapping
fix: spring mvc采集时兼容有多个RequestMappingHandlerMapping的情况
2 parents 3352132 + e2fd87a commit 0e10d98

File tree

2 files changed

+38
-9
lines changed

2 files changed

+38
-9
lines changed

dongtai-api-gather/dongtai-api-gather-spring-api/src/main/java/io/dongtai/iast/api/gather/spring/extractor/SpringMVCApiExtractor.java

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
88

99
import java.lang.reflect.Method;
10-
import java.util.Map;
10+
import java.util.*;
11+
import java.util.stream.Collectors;
1112

1213
/**
1314
* @author CC11001100
@@ -21,11 +22,26 @@ public class SpringMVCApiExtractor {
2122
* @param applicationContext
2223
* @return
2324
*/
24-
public static OpenApi run(Object applicationContext) {
25+
public static List<OpenApi> run(Object applicationContext) {
2526
WebApplicationContext webApplicationContext = (WebApplicationContext) applicationContext;
2627
SpringMVCApiExtractor springApplicationContext = new SpringMVCApiExtractor();
27-
RequestMappingHandlerMapping requestMappingHandlerMapping = springApplicationContext.findRequestMappingHandlerMapping(webApplicationContext);
28-
return new RequestMappingHandlerMappingConvertor(webApplicationContext, requestMappingHandlerMapping).parse();
28+
List<RequestMappingHandlerMapping> requestMappingHandlerMappingList = springApplicationContext.findRequestMappingHandlerMapping(webApplicationContext);
29+
if (requestMappingHandlerMappingList == null || requestMappingHandlerMappingList.isEmpty()) {
30+
DongTaiLog.debug("spring mvc can not find RequestMappingHandlerMapping beans");
31+
return null;
32+
}
33+
return requestMappingHandlerMappingList
34+
.stream()
35+
.map(mapping -> {
36+
try {
37+
return new RequestMappingHandlerMappingConvertor(webApplicationContext, mapping).parse();
38+
} catch (Throwable e) {
39+
DongTaiLog.debug("spring mvc RequestMappingHandlerMappingConvertor parse error", e);
40+
return null;
41+
}
42+
})
43+
.filter(Objects::nonNull)
44+
.collect(Collectors.toList());
2945
}
3046

3147
/**
@@ -34,7 +50,7 @@ public static OpenApi run(Object applicationContext) {
3450
* @param applicationContext
3551
* @return
3652
*/
37-
private RequestMappingHandlerMapping findRequestMappingHandlerMapping(WebApplicationContext applicationContext) {
53+
private List<RequestMappingHandlerMapping> findRequestMappingHandlerMapping(WebApplicationContext applicationContext) {
3854

3955
if (applicationContext == null) {
4056
return null;
@@ -52,15 +68,23 @@ private RequestMappingHandlerMapping findRequestMappingHandlerMapping(WebApplica
5268
Map<String, RequestMappingHandlerMapping> m = (Map<String, RequestMappingHandlerMapping>) invoke;
5369
RequestMappingHandlerMapping requestMappingHandlerMapping = m.get("requestMappingHandlerMapping");
5470
if (requestMappingHandlerMapping != null) {
55-
return requestMappingHandlerMapping;
71+
return Collections.singletonList(requestMappingHandlerMapping);
5672
}
5773
}
5874
} catch (Throwable e) {
5975
DongTaiLog.debug("try use BeanFactoryUtils find RequestMappingHandlerMapping exception", e);
6076
}
6177

6278
// 没有工具类,就只从自己里面找
63-
return applicationContext.getBean(RequestMappingHandlerMapping.class);
79+
// 2023-7-11 16:58:23 注意,此处可能会寻找到多个,寻找到多个的时候统统上报
80+
// case:
81+
// <dependency>
82+
// <groupId>io.springfox</groupId>
83+
// <artifactId>springfox-swagger2</artifactId>
84+
// <version>2.7.0</version>
85+
// </dependency>
86+
// 它会创建一个自己的 springfox.documentation.spring.web.PropertySourcedRequestMappingHandlerMapping 继承了 RequestMappingHandlerMapping
87+
return new ArrayList<>(applicationContext.getBeansOfType(RequestMappingHandlerMapping.class).values());
6488
}
6589

6690
}

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/api/SpringGatherApiThread.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.lang.reflect.InvocationTargetException;
1010
import java.lang.reflect.Method;
1111
import java.net.URL;
12+
import java.util.List;
1213

1314
/**
1415
* @author CC11001100
@@ -72,8 +73,12 @@ public void run() {
7273
private void runWithClassLoader(ClassLoader classLoader) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException {
7374
Class<?> proxyClass = classLoader.loadClass("io.dongtai.iast.api.gather.spring.extractor.SpringMVCApiExtractor");
7475
Method getAPI = proxyClass.getDeclaredMethod("run", Object.class);
75-
Object openApi = getAPI.invoke(null, applicationContext);
76-
report(openApi, FRAMEWORK_NAME);
76+
Object openApiList = getAPI.invoke(null, applicationContext);
77+
if (openApiList == null) {
78+
return;
79+
}
80+
// 返回的是一个报告列表
81+
((List) openApiList).forEach(o -> report(o, FRAMEWORK_NAME));
7782
}
7883

7984
}

0 commit comments

Comments
 (0)