HandlerInterceptorAdapter 和 Zuul Filter
HandlerInterceptorAdapter and Zuul Filter
可以添加 HandlerInterceptorAdapter
和 Zuul 配置。我需要拦截对特定资源的请求,但我想因为我有 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);
}
}
可以添加 HandlerInterceptorAdapter
和 Zuul 配置。我需要拦截对特定资源的请求,但我想因为我有 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);
}
}