반응형
스프링 부트 응용 프로그램에서 인터셉트의 실행 순서를 정의하는 방법은 무엇입니까?
인터셉터를 정의하고 이를 확장하는 클래스(구성에 주석이 있는 클래스)에 등록합니다.WebMvcConfigurerAdapter
그러나 일부 인터셉트를 정의하는 일부 타사 라이브러리도 사용합니다.나는 내 인터셉트가 인터셉트 실행 체인의 마지막 인터셉트가 되길 원합니다.이것을 시행할 방법이 없는 것 같습니다.스프링 부트 응용 프로그램에서 인터셉트의 실행 순서를 정의하는 방법은 무엇입니까?
만약 우리가 여러 개의 요격기를 가지고 있다면, 대신에@Order
아래와 같이 우리가 할 수 있는 주석.
@EnableWebMvc
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry
.addWebRequestInterceptor(new WebRequestInterceptor() {
//Overrides
}).order(Ordered.HIGHEST_PRECEDENCE);
registry
.addWebRequestInterceptor(new WebRequestInterceptor() {
//Overrides
}).order(Ordered.LOWEST_PRECEDENCE);
}
}
모든 Feign 클라이언트는 프록시가 되므로 요청 가로채기의 순서를 변경하는 방법은 하나뿐입니다.그러나 프록시를 SGLIB로 변경하면 작동하지 않기 때문에 사용할 수 없습니다.
if(bean instanceof YoursFeignClientBean) {
Class<Proxy> superclass = (Class<Proxy>) bean.getClass().getSuperclass();
Field h = superclass.getDeclaredField("h");
h.setAccessible(true);
// its FeignInvocationHandler
InvocationHandler ih = (InvocationHandler) ReflectionUtils.getField(h, bean);
Field dispatch = ih.getClass().getDeclaredField("dispatch");
dispatch.setAccessible(true);
Map<Method, InvocationHandlerFactory.MethodHandler> map =
(Map<Method, InvocationHandlerFactory.MethodHandler>) dispatch.get(ih);
for (Method method : map.keySet()) {
InvocationHandlerFactory.MethodHandler handler = map.get(method);
Field requestInterceptors = handler.getClass().getDeclaredField("requestInterceptors");
requestInterceptors.setAccessible(true);
List<RequestInterceptor> interceptorList = (List<RequestInterceptor>)
ReflectionUtils.getField(requestInterceptors, handler);
RequestInterceptor ri = interceptorList.stream().filter(t -> t.getClass().getName().startsWith(YoursFeignConfig.class.getName())).findFirst().get();
// reorder
interceptorList.remove(ri);
interceptorList.add(ri);
}
제 경험에 따르면, 인터셉트가 스택을 추가하고 있습니다.이러한 이유로 다른 것보다 전화를 걸기 전에 원하는 것보다 먼저 등록을 추가해야 합니다.
언급URL : https://stackoverflow.com/questions/32665915/how-to-define-the-execution-order-of-interceptor-in-spring-boot-application
반응형
'programing' 카테고리의 다른 글
R의 data.frame에서 전체 열 제거 (0) | 2023.06.25 |
---|---|
TypeScript에서 일반 JavaScript 개체 유형을 대상으로 하는 방법이 있습니까? (0) | 2023.06.25 |
얕은 깃 서브모듈을 만드는 방법은? (0) | 2023.06.25 |
PLS-00302가 표시되는 이유: 구성 요소가 있을 때 선언되어야 합니까? (0) | 2023.06.25 |
$lookup Aggregation 연산자와 함께 샤딩을 사용하는 MongoDB (0) | 2023.06.25 |