Spring Cloud Gateway MVC如何为所有路由统一配置过滤器?
Spring Cloud Gateway MVC 全局过滤器配置方案
问题背景
我正在使用Spring Cloud Gateway MVC,需要为所有路由统一应用过滤器。尝试过在application.yml中配置spring.cloud.gateway.default-filters,但这个配置只对响应式版本的Spring Cloud Gateway生效,在MVC版本里不起作用。目前的做法是在每个路由类中重复添加过滤器,但路由类数量很多,希望通过YAML配置或Java类实现全局统一配置。
使用的依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway-mvc</artifactId> </dependency>
当前重复配置的示例:
@Bean public RouterFunction<ServerResponse> getRoutesCadastrosAlcada() { return route() .POST("someUrl", http(URL_GPOC_CADASTROS)) // 多个POST路由定义 .POST("someUrl", http(URL_GPOC_CADASTROS)) .after(removeResponseHeader("Access-Control-Allow-Origin")) .build(); }
可行解决方案
方案一:自定义全局GlobalFilter(推荐)
Spring Cloud Gateway MVC提供了org.springframework.cloud.gateway.mvc.filter.GlobalFilter接口,实现该接口并标记为Spring组件后,过滤器会自动作用于所有路由。
示例代码:
import org.springframework.cloud.gateway.mvc.filter.GlobalFilter; import org.springframework.stereotype.Component; import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; @Component public class GlobalResponseHeaderFilter implements GlobalFilter { @Override public ServerResponse filter(ServerRequest request, ServerResponse response, Chain chain) { // 实现全局过滤逻辑:移除指定响应头 ServerResponse modifiedResponse = response.mutate() .headers(headers -> headers.remove("Access-Control-Allow-Origin")) .build(); return chain.filter(request, modifiedResponse); } }
只需创建这个类,所有路由都会自动应用该过滤逻辑,无需在每个路由Bean中重复配置。
方案二:封装路由构建工具类
如果需要灵活控制路由的全局过滤器集合,可以封装一个工具方法,统一添加全局过滤器,再在各个路由Bean中复用。
工具类示例:
import org.springframework.web.servlet.function.RouterFunction; import org.springframework.web.servlet.function.ServerResponse; import static org.springframework.cloud.gateway.mvc.after.AfterFilters.removeResponseHeader; public class GatewayRouteHelper { public static RouterFunction<ServerResponse> applyGlobalFilters(RouterFunction<ServerResponse> baseRoutes) { return baseRoutes .after(removeResponseHeader("Access-Control-Allow-Origin")) // 可添加更多全局过滤器 ; } }
路由Bean中使用:
@Bean public RouterFunction<ServerResponse> getRoutesCadastrosAlcada() { RouterFunction<ServerResponse> baseRoutes = route() .POST("someUrl", http(URL_GPOC_CADASTROS)) // 多个POST路由定义 .POST("someUrl", http(URL_GPOC_CADASTROS)) .build(); return GatewayRouteHelper.applyGlobalFilters(baseRoutes); }
关于YAML配置的说明
Spring Cloud Gateway MVC不支持通过application.yml中的spring.cloud.gateway.default-filters配置全局过滤器,只能通过Java代码方式实现全局过滤逻辑。
内容的提问来源于stack exchange,提问作者Jean Gonçalves
相关产品推荐
相关产品推荐

