如何在Spring Cloud Gateway中使用RequestInterceptor拦截所有请求?
答案
你自定义的org.apache.http.HttpRequestInterceptor接口实现无法直接配置到Spring Cloud Gateway中对所有请求生效,核心原因是两者属于完全独立的技术体系:
org.apache.http.HttpRequestInterceptor是Apache HttpClient组件栈的专属扩展点,仅对Apache HttpClient实例本身发起的请求生效- Spring Cloud Gateway基于Spring WebFlux + Netty构建,自身的请求处理链路有独立的扩展机制,和Apache HttpClient的拦截器接口不兼容
如果你需要让所有流经Spring Cloud Gateway的请求都执行你现有拦截器中的业务逻辑,可按照以下方案实现:
- 先把你在
HttpRequestInterceptor中实现的业务逻辑抽成独立的公共组件,解除和Apache HttpClient接口的耦合 - 实现Spring Cloud Gateway提供的
GlobalFilter全局过滤器,重写filter方法,在方法中调用你抽离的公共逻辑,即可实现对所有网关请求的统一处理
示例代码结构参考:
import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; // 自定义全局过滤器 public class CustomRequestGlobalFilter implements GlobalFilter, Ordered { // 注入你抽离的公共逻辑组件 private final YourCommonRequestHandler commonHandler; public CustomRequestGlobalFilter(YourCommonRequestHandler commonHandler) { this.commonHandler = commonHandler; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 此处执行原HttpRequestInterceptor中的逻辑 commonHandler.handleRequest(exchange.getRequest()); return chain.filter(exchange); } @Override public int getOrder() { // 调整过滤器优先级,数字越小优先级越高 return 0; } }
- 将自定义的
GlobalFilter注册为Spring Bean,无需额外配置就会自动对所有网关请求生效
@Configuration public class GatewayConfig { @Bean public GlobalFilter customRequestGlobalFilter(YourCommonRequestHandler commonHandler) { return new CustomRequestGlobalFilter(commonHandler); } }
如果你仅需要对网关转发到下游服务的请求应用拦截逻辑,且你的Spring Cloud Gateway配置了使用Apache HttpClient作为下游调用客户端,你可以直接将自定义的HttpRequestInterceptor配置到下游调用的HttpClient实例中,不过该配置仅作用于网关发往下游的请求,无法作用于网关接收的客户端原始请求。
内容的提问来源于stack exchange,提问作者nikhil gs
相关产品推荐
相关产品推荐

