可以使用Zuul配置添加HandlerInterceptorAdapter。我需要拦截对特定资源的请求,但是我想因为我有Zuul过滤器配置,所以永远不会调用拦截器。

有可能这样做吗?

最佳答案

我试图达到相同的目的。我们有一些Spring MVC控制器和Zuul代理。但是我仍然希望使用相同的拦截器。

这里的问题是zuul在其自己的ZuulServlet中运行,并且没有从您的MVC servlet中获取拦截器。 Spring Cloud: ZuulConfiguration.java配置ZuulHandlerMapping,这是可以设置的唯一位置拦截器,但是它不是可配置的。因此,您需要一个InstantiationAwareBeanPostProcessorAdapter来干扰bean的创建,在实例化之后但在初始化之前(在初始化拦截器之前)设置拦截器。

这帮了我大忙:

@Configuration
@RequiredArgsConstructor
public class ZuulHandlerBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {

    @NonNull
    private final MyInterceptor myInterceptor;

    @Override
    public boolean postProcessAfterInstantiation(final Object bean, final String beanName) throws BeansException {

        if (bean instanceof ZuulHandlerMapping) {

            val zuulHandlerMapping = (ZuulHandlerMapping) bean;
            zuulHandlerMapping.setInterceptors(myInterceptor);
        }

        return super.postProcessAfterInstantiation(bean, beanName);
    }

}

09-04 18:38