Skip to content

Commit 4139200

Browse files
committed
Fix system path issue
1 parent 87074e0 commit 4139200

File tree

6 files changed

+211
-177
lines changed

6 files changed

+211
-177
lines changed

joylive-plugin/joylive-router/joylive-router-springweb5/src/main/java/com/jd/live/agent/plugin/router/springweb/v5/request/ReactiveInboundRequest.java

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
import org.springframework.core.io.buffer.DataBufferUtils;
2828
import org.springframework.http.HttpCookie;
2929
import org.springframework.http.server.reactive.ServerHttpRequest;
30-
import org.springframework.web.method.HandlerMethod;
3130
import org.springframework.web.reactive.HandlerResult;
32-
import org.springframework.web.server.ServerWebExchange;
3331
import reactor.core.publisher.Mono;
3432

3533
import java.io.ByteArrayInputStream;
@@ -39,7 +37,6 @@
3937
import java.util.concurrent.CompletionStage;
4038
import java.util.function.Predicate;
4139

42-
import static com.jd.live.agent.core.util.type.ClassUtils.loadClass;
4340
import static com.jd.live.agent.plugin.router.springweb.v5.exception.SpringInboundThrower.THROWER;
4441

4542
/**
@@ -50,41 +47,7 @@
5047
*/
5148
public class ReactiveInboundRequest extends AbstractHttpInboundRequest<ServerHttpRequest> {
5249

53-
private static final String ACTUATOR_TYPE = "org.springframework.boot.actuate.endpoint.web.reactive.AbstractWebFluxEndpointHandlerMapping$WebFluxEndpointHandlerMethod";
5450

55-
private static final Class<?> ACTUATOR_CLASS = loadClass(ACTUATOR_TYPE, ServerWebExchange.class.getClassLoader());
56-
57-
private static final String RESOURCE_HANDLER_TYPE = "org.springframework.web.reactive.function.server.ResourceHandlerFunction";
58-
59-
private static final Class<?> RESOURCE_HANDLER_CLASS = loadClass(RESOURCE_HANDLER_TYPE, ServerWebExchange.class.getClassLoader());
60-
61-
private static final String RESOURCE_WEB_HANDLER_TYPE = "org.springframework.web.reactive.resource.ResourceWebHandler";
62-
63-
private static final Class<?> RESOURCE_WEB_HANDLER_CLASS = loadClass(RESOURCE_WEB_HANDLER_TYPE, ServerWebExchange.class.getClassLoader());
64-
65-
private static final String OPEN_API_RESOURCE_TYPE = "org.springdoc.webflux.api.OpenApiResource";
66-
67-
private static final Class<?> OPEN_API_RESOURCE_CLASS = loadClass(OPEN_API_RESOURCE_TYPE, ServerWebExchange.class.getClassLoader());
68-
69-
private static final String MULTIPLE_OPEN_API_RESOURCE_TYPE = "org.springdoc.webflux.api.MultipleOpenApiResource";
70-
71-
private static final Class<?> MULTIPLE_OPEN_API_RESOURCE_CLASS = loadClass(MULTIPLE_OPEN_API_RESOURCE_TYPE, ServerWebExchange.class.getClassLoader());
72-
73-
private static final String SWAGGER_CONFIG_RESOURCE_TYPE = "org.springdoc.webflux.ui.SwaggerConfigResource";
74-
75-
private static final Class<?> SWAGGER_CONFIG_RESOURCE_CLASS = loadClass(SWAGGER_CONFIG_RESOURCE_TYPE, ServerWebExchange.class.getClassLoader());
76-
77-
private static final String SWAGGER_UI_HOME_TYPE = "org.springdoc.webflux.ui.SwaggerUiHome";
78-
79-
private static final Class<?> SWAGGER_UI_HOME_CLASS = loadClass(SWAGGER_UI_HOME_TYPE, ServerWebExchange.class.getClassLoader());
80-
81-
private static final String SWAGGER_WELCOME_COMMON_TYPE = "org.springdoc.webflux.ui.SwaggerWelcomeCommon";
82-
83-
private static final Class<?> SWAGGER_WELCOME_COMMON_CLASS = loadClass(SWAGGER_WELCOME_COMMON_TYPE, ServerWebExchange.class.getClassLoader());
84-
85-
private static final String SWAGGER2_CONTROLLER_WEBFLUX_TYPE = "springfox.documentation.swagger2.web.Swagger2ControllerWebFlux";
86-
87-
private static final Class<?> SWAGGER2_CONTROLLER_WEBFLUX_CLASS = loadClass(SWAGGER2_CONTROLLER_WEBFLUX_TYPE, ServerWebExchange.class.getClassLoader());
8851

8952
private final Predicate<String> systemPredicate;
9053

@@ -119,25 +82,10 @@ public String getClientIp() {
11982

12083
@Override
12184
public boolean isSystem() {
122-
if (RESOURCE_HANDLER_CLASS != null && RESOURCE_HANDLER_CLASS.isInstance(handler)) {
123-
return true;
124-
} else if (RESOURCE_WEB_HANDLER_CLASS != null && RESOURCE_WEB_HANDLER_CLASS.isInstance(handler)) {
85+
if (CloudUtils.isSystemHandler(handler)) {
12586
return true;
126-
} else if (ACTUATOR_CLASS != null && ACTUATOR_CLASS.isInstance(handler)) {
127-
return true;
128-
} else if (handler instanceof HandlerMethod) {
129-
HandlerMethod method = (HandlerMethod) handler;
130-
Object bean = method.getBean();
131-
if (OPEN_API_RESOURCE_CLASS != null && OPEN_API_RESOURCE_CLASS.isInstance(bean)
132-
|| MULTIPLE_OPEN_API_RESOURCE_CLASS != null && MULTIPLE_OPEN_API_RESOURCE_CLASS.isInstance(bean)
133-
|| SWAGGER_CONFIG_RESOURCE_CLASS != null && SWAGGER_CONFIG_RESOURCE_CLASS.isInstance(bean)
134-
|| SWAGGER_UI_HOME_CLASS != null && SWAGGER_UI_HOME_CLASS.isInstance(bean)
135-
|| SWAGGER_WELCOME_COMMON_CLASS != null && SWAGGER_WELCOME_COMMON_CLASS.isInstance(bean)
136-
|| SWAGGER2_CONTROLLER_WEBFLUX_CLASS != null && SWAGGER2_CONTROLLER_WEBFLUX_CLASS.isInstance(bean)
137-
) {
138-
return true;
139-
}
140-
} else if (systemPredicate != null && systemPredicate.test(getPath())) {
87+
}
88+
if (systemPredicate != null && systemPredicate.test(getPath())) {
14189
return true;
14290
}
14391
return super.isSystem();

joylive-plugin/joylive-router/joylive-router-springweb5/src/main/java/com/jd/live/agent/plugin/router/springweb/v5/util/CloudUtils.java

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
import com.jd.live.agent.bootstrap.util.type.FieldAccessor;
1919
import org.springframework.http.HttpHeaders;
2020
import org.springframework.web.reactive.function.client.WebClientResponseException;
21+
import org.springframework.web.server.ServerWebExchange;
22+
23+
import java.util.Arrays;
24+
import java.util.List;
25+
import java.util.stream.Collectors;
2126

2227
import static com.jd.live.agent.bootstrap.util.type.FieldAccessorFactory.getAccessor;
2328
import static com.jd.live.agent.core.util.type.ClassUtils.loadClass;
@@ -29,20 +34,68 @@ public class CloudUtils {
2934

3035
private static final String TYPE_WEB_CLIENT_RESPONSE_EXCEPTION = "org.springframework.web.reactive.function.client.WebClientResponseException";
3136

32-
private static final Class<?> CLASS_WEB_CLIENT_RESPONSE_EXCEPTION = loadClass(TYPE_WEB_CLIENT_RESPONSE_EXCEPTION, HttpHeaders.class.getClassLoader());
37+
private static final ClassLoader CLASS_LOADER = HttpHeaders.class.getClassLoader();
38+
39+
private static final Class<?> CLASS_WEB_CLIENT_RESPONSE_EXCEPTION = loadClass(TYPE_WEB_CLIENT_RESPONSE_EXCEPTION, CLASS_LOADER);
3340

3441
private static final String TYPE_HANDLER_METHOD = "org.springframework.web.method.HandlerMethod";
3542

36-
private static final Class<?> CLASS_HANDLER_METHOD = loadClass(TYPE_HANDLER_METHOD, HttpHeaders.class.getClassLoader());
43+
private static final Class<?> CLASS_HANDLER_METHOD = loadClass(TYPE_HANDLER_METHOD, CLASS_LOADER);
3744

3845
private static final FieldAccessor ACCESSOR_HANDLER = getAccessor(CLASS_HANDLER_METHOD, "bean");
3946

4047
private static final String TYPE_HANDLER_RESULT = "org.springframework.web.reactive.HandlerResult";
4148

42-
private static final Class<?> CLASS_HANDLER_RESULT = loadClass(TYPE_HANDLER_RESULT, HttpHeaders.class.getClassLoader());
49+
private static final Class<?> CLASS_HANDLER_RESULT = loadClass(TYPE_HANDLER_RESULT, CLASS_LOADER);
4350

4451
private static final FieldAccessor ACCESSOR_EXCEPTION_HANDLER = getAccessor(CLASS_HANDLER_RESULT, "exceptionHandler");
4552

53+
private static final String CONTROLLER_TYPE = "org.springframework.web.servlet.mvc.Controller";
54+
private static final Class<?> CONTROLLER_CLASS = loadClass(CONTROLLER_TYPE, CLASS_LOADER);
55+
private static final String ERROR_CONTROLLER_TYPE = "org.springframework.boot.web.servlet.error.ErrorController";
56+
private static final Class<?> ERROR_CONTROLLER_CLASS = loadClass(ERROR_CONTROLLER_TYPE, CLASS_LOADER);
57+
private static final String RESOURCE_HANDLER_TYPE = "org.springframework.web.servlet.resource.ResourceHttpRequestHandler";
58+
private static final Class<?> RESOURCE_HANDLER_CLASS = loadClass(RESOURCE_HANDLER_TYPE, CLASS_LOADER);
59+
private static final String ACTUATOR_SERVLET_TYPE = "org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$WebMvcEndpointHandlerMethod";
60+
private static final Class<?> ACTUATOR_SERVLET_CLASS = loadClass(ACTUATOR_SERVLET_TYPE, CLASS_LOADER);
61+
private static final String API_RESOURCE_CONTROLLER_TYPE = "springfox.documentation.swagger.web.ApiResourceController";
62+
private static final Class<?> API_RESOURCE_CONTROLLER_CLASS = loadClass(API_RESOURCE_CONTROLLER_TYPE, CLASS_LOADER);
63+
private static final String SWAGGER2_CONTROLLER_WEB_MVC_TYPE = "springfox.documentation.swagger2.web.Swagger2ControllerWebMvc";
64+
private static final Class<?> SWAGGER2_CONTROLLER_WEB_MVC_CLASS = loadClass(SWAGGER2_CONTROLLER_WEB_MVC_TYPE, CLASS_LOADER);
65+
private static final String OPEN_API_RESOURCE_TYPE = "org.springdoc.webmvc.api.OpenApiResource";
66+
private static final Class<?> OPEN_API_RESOURCE_CLASS = loadClass(OPEN_API_RESOURCE_TYPE, CLASS_LOADER);
67+
private static final String MULTIPLE_OPEN_API_RESOURCE_TYPE = "org.springdoc.webmvc.api.MultipleOpenApiResource";
68+
private static final Class<?> MULTIPLE_OPEN_API_RESOURCE_CLASS = loadClass(MULTIPLE_OPEN_API_RESOURCE_TYPE, CLASS_LOADER);
69+
private static final String SWAGGER_CONFIG_RESOURCE_TYPE = "org.springdoc.webmvc.ui.SwaggerConfigResource";
70+
private static final Class<?> SWAGGER_CONFIG_RESOURCE_CLASS = loadClass(SWAGGER_CONFIG_RESOURCE_TYPE, CLASS_LOADER);
71+
private static final String SWAGGER_UI_HOME_TYPE = "org.springdoc.webmvc.ui.SwaggerUiHome";
72+
private static final Class<?> SWAGGER_UI_HOME_CLASS = loadClass(SWAGGER_UI_HOME_TYPE, CLASS_LOADER);
73+
private static final String SWAGGER_WELCOME_COMMON_TYPE = "org.springdoc.webmvc.ui.SwaggerWelcomeCommon";
74+
private static final Class<?> SWAGGER_WELCOME_COMMON_CLASS = loadClass(SWAGGER_WELCOME_COMMON_TYPE, CLASS_LOADER);
75+
private static final String ACTUATOR_TYPE = "org.springframework.boot.actuate.endpoint.web.reactive.AbstractWebFluxEndpointHandlerMapping$WebFluxEndpointHandlerMethod";
76+
private static final Class<?> ACTUATOR_CLASS = loadClass(ACTUATOR_TYPE, ServerWebExchange.class.getClassLoader());
77+
private static final String RESOURCE_WEB_HANDLER_TYPE = "org.springframework.web.reactive.resource.ResourceWebHandler";
78+
private static final Class<?> RESOURCE_WEB_HANDLER_CLASS = loadClass(RESOURCE_WEB_HANDLER_TYPE, ServerWebExchange.class.getClassLoader());
79+
private static final String SWAGGER2_CONTROLLER_WEBFLUX_TYPE = "springfox.documentation.swagger2.web.Swagger2ControllerWebFlux";
80+
private static final Class<?> SWAGGER2_CONTROLLER_WEBFLUX_CLASS = loadClass(SWAGGER2_CONTROLLER_WEBFLUX_TYPE, ServerWebExchange.class.getClassLoader());
81+
82+
private static final List<Class<?>> SYSTEM_HANDLERS = Arrays.asList(
83+
CONTROLLER_CLASS,
84+
RESOURCE_HANDLER_CLASS,
85+
RESOURCE_WEB_HANDLER_CLASS,
86+
ERROR_CONTROLLER_CLASS,
87+
API_RESOURCE_CONTROLLER_CLASS,
88+
ACTUATOR_CLASS,
89+
OPEN_API_RESOURCE_CLASS,
90+
MULTIPLE_OPEN_API_RESOURCE_CLASS,
91+
SWAGGER_CONFIG_RESOURCE_CLASS,
92+
SWAGGER_UI_HOME_CLASS,
93+
SWAGGER_WELCOME_COMMON_CLASS,
94+
SWAGGER2_CONTROLLER_WEB_MVC_CLASS,
95+
SWAGGER2_CONTROLLER_WEBFLUX_CLASS,
96+
ACTUATOR_SERVLET_CLASS
97+
).stream().filter(v -> v != null).collect(Collectors.toList());
98+
4699
/**
47100
* Creates writable copy of HTTP headers.
48101
*
@@ -61,6 +114,17 @@ public static <T> T getExceptionHandler(Object handlerResult) {
61114
return ACCESSOR_EXCEPTION_HANDLER != null && handlerResult != null && CLASS_HANDLER_RESULT.isInstance(handlerResult) ? (T) ACCESSOR_EXCEPTION_HANDLER.get(handlerResult) : null;
62115
}
63116

117+
public static boolean isSystemHandler(Object handler) {
118+
if (handler != null) {
119+
for (Class<?> clazz : SYSTEM_HANDLERS) {
120+
if (clazz.isInstance(handler)) {
121+
return true;
122+
}
123+
}
124+
}
125+
return false;
126+
}
127+
64128
/**
65129
* Safely extracts error message from exception, including WebClient response body when available.
66130
*

joylive-plugin/joylive-router/joylive-router-springweb6/src/main/java/com/jd/live/agent/plugin/router/springweb/v6/request/ReactiveInboundRequest.java

Lines changed: 3 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
import org.springframework.core.io.buffer.DataBufferUtils;
2828
import org.springframework.http.HttpCookie;
2929
import org.springframework.http.server.reactive.ServerHttpRequest;
30-
import org.springframework.web.method.HandlerMethod;
3130
import org.springframework.web.reactive.HandlerResult;
32-
import org.springframework.web.server.ServerWebExchange;
3331
import reactor.core.publisher.Mono;
3432

3533
import java.io.ByteArrayInputStream;
@@ -39,7 +37,6 @@
3937
import java.util.concurrent.CompletionStage;
4038
import java.util.function.Predicate;
4139

42-
import static com.jd.live.agent.core.util.type.ClassUtils.loadClass;
4340
import static com.jd.live.agent.plugin.router.springweb.v6.exception.SpringInboundThrower.THROWER;
4441

4542
/**
@@ -54,42 +51,6 @@ public class ReactiveInboundRequest extends AbstractHttpInboundRequest<ServerHtt
5451

5552
public static final String KEY_LIVE_EXCEPTION_HANDLED = "x-live-exception-handled";
5653

57-
private static final String ACTUATOR_TYPE = "org.springframework.boot.actuate.endpoint.web.reactive.AbstractWebFluxEndpointHandlerMapping$WebFluxEndpointHandlerMethod";
58-
59-
private static final Class<?> ACTUATOR_CLASS = loadClass(ACTUATOR_TYPE, ServerWebExchange.class.getClassLoader());
60-
61-
private static final String RESOURCE_HANDLER_TYPE = "org.springframework.web.reactive.function.server.ResourceHandlerFunction";
62-
63-
private static final Class<?> RESOURCE_HANDLER_CLASS = loadClass(RESOURCE_HANDLER_TYPE, ServerWebExchange.class.getClassLoader());
64-
65-
private static final String RESOURCE_WEB_HANDLER_TYPE = "org.springframework.web.reactive.resource.ResourceWebHandler";
66-
67-
private static final Class<?> RESOURCE_WEB_HANDLER_CLASS = loadClass(RESOURCE_WEB_HANDLER_TYPE, ServerWebExchange.class.getClassLoader());
68-
69-
private static final String OPEN_API_RESOURCE_TYPE = "org.springdoc.webflux.api.OpenApiResource";
70-
71-
private static final Class<?> OPEN_API_RESOURCE_CLASS = loadClass(OPEN_API_RESOURCE_TYPE, ServerWebExchange.class.getClassLoader());
72-
73-
private static final String MULTIPLE_OPEN_API_RESOURCE_TYPE = "org.springdoc.webflux.api.MultipleOpenApiResource";
74-
75-
private static final Class<?> MULTIPLE_OPEN_API_RESOURCE_CLASS = loadClass(MULTIPLE_OPEN_API_RESOURCE_TYPE, ServerWebExchange.class.getClassLoader());
76-
77-
private static final String SWAGGER_CONFIG_RESOURCE_TYPE = "org.springdoc.webflux.ui.SwaggerConfigResource";
78-
79-
private static final Class<?> SWAGGER_CONFIG_RESOURCE_CLASS = loadClass(SWAGGER_CONFIG_RESOURCE_TYPE, ServerWebExchange.class.getClassLoader());
80-
81-
private static final String SWAGGER_UI_HOME_TYPE = "org.springdoc.webflux.ui.SwaggerUiHome";
82-
83-
private static final Class<?> SWAGGER_UI_HOME_CLASS = loadClass(SWAGGER_UI_HOME_TYPE, ServerWebExchange.class.getClassLoader());
84-
85-
private static final String SWAGGER_WELCOME_COMMON_TYPE = "org.springdoc.webflux.ui.SwaggerWelcomeCommon";
86-
87-
private static final Class<?> SWAGGER_WELCOME_COMMON_CLASS = loadClass(SWAGGER_WELCOME_COMMON_TYPE, ServerWebExchange.class.getClassLoader());
88-
89-
private static final String SWAGGER2_CONTROLLER_WEBFLUX_TYPE = "springfox.documentation.swagger2.web.Swagger2ControllerWebFlux";
90-
91-
private static final Class<?> SWAGGER2_CONTROLLER_WEBFLUX_CLASS = loadClass(SWAGGER2_CONTROLLER_WEBFLUX_TYPE, ServerWebExchange.class.getClassLoader());
92-
9354
private final Predicate<String> systemPredicate;
9455

9556
private final Predicate<String> mcpPredicate;
@@ -123,25 +84,10 @@ public String getClientIp() {
12384

12485
@Override
12586
public boolean isSystem() {
126-
if (RESOURCE_HANDLER_CLASS != null && RESOURCE_HANDLER_CLASS.isInstance(handler)) {
127-
return true;
128-
} else if (RESOURCE_WEB_HANDLER_CLASS != null && RESOURCE_WEB_HANDLER_CLASS.isInstance(handler)) {
87+
if (CloudUtils.isSystemHandler(handler)) {
12988
return true;
130-
} else if (ACTUATOR_CLASS != null && ACTUATOR_CLASS.isInstance(handler)) {
131-
return true;
132-
} else if (handler instanceof HandlerMethod) {
133-
HandlerMethod method = (HandlerMethod) handler;
134-
Object bean = method.getBean();
135-
if (OPEN_API_RESOURCE_CLASS != null && OPEN_API_RESOURCE_CLASS.isInstance(bean)
136-
|| MULTIPLE_OPEN_API_RESOURCE_CLASS != null && MULTIPLE_OPEN_API_RESOURCE_CLASS.isInstance(bean)
137-
|| SWAGGER_CONFIG_RESOURCE_CLASS != null && SWAGGER_CONFIG_RESOURCE_CLASS.isInstance(bean)
138-
|| SWAGGER_UI_HOME_CLASS != null && SWAGGER_UI_HOME_CLASS.isInstance(bean)
139-
|| SWAGGER_WELCOME_COMMON_CLASS != null && SWAGGER_WELCOME_COMMON_CLASS.isInstance(bean)
140-
|| SWAGGER2_CONTROLLER_WEBFLUX_CLASS != null && SWAGGER2_CONTROLLER_WEBFLUX_CLASS.isInstance(bean)
141-
) {
142-
return true;
143-
}
144-
} else if (systemPredicate != null && systemPredicate.test(getPath())) {
89+
}
90+
if (systemPredicate != null && systemPredicate.test(getPath())) {
14591
return true;
14692
}
14793
return super.isSystem();

0 commit comments

Comments
 (0)