programing

스프링 부트 응용 프로그램에서 인터셉트의 실행 순서를 정의하는 방법은 무엇입니까?

batch 2023. 6. 25. 18:34
반응형

스프링 부트 응용 프로그램에서 인터셉트의 실행 순서를 정의하는 방법은 무엇입니까?

인터셉터를 정의하고 이를 확장하는 클래스(구성에 주석이 있는 클래스)에 등록합니다.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

반응형