自定义过滤器在 Spring Cloud Gateway 中是实现特定需求的重要方式。通过自定义过滤器,可以在请求进入网关时、路由到目标服务前以及响应返回客户端之前执行特定的逻辑。下面是创建和配置自定义过滤器的详细步骤:
创建自定义过滤器
实现 GatewayFilter 接口
首先,创建一个实现 GatewayFilter
接口的类。在这个类中,你可以定义需要执行的过滤逻辑。
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
public class MyCustomFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 在这里添加自定义逻辑,例如修改请求头
exchange.getRequest().mutate().header("X-Custom-Header", "MyCustomValue").build();
// 继续执行过滤链
return chain.filter(exchange);
}
}
配置自定义过滤器
通过 Java 配置
在 Spring 配置类中,通过 RouteLocatorBuilder
将自定义过滤器添加到路由配置中。
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("custom_filter_route", r -> r.path("/custom/**")
.filters(f -> f.filter(new MyCustomFilter()))
.uri("http://example.org"))
.build();
}
}
通过 YAML 配置
如果你更喜欢使用 YAML 文件来配置路由,可以通过定义一个自定义过滤器工厂来实现。
- 首先,创建一个自定义过滤器工厂类。
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class MyCustomFilterFactory extends AbstractGatewayFilterFactory<MyCustomFilterFactory.Config> {
public MyCustomFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
// 在这里添加自定义逻辑
exchange.getRequest().mutate().header("X-Custom-Header", config.customHeaderValue).build();
// 继续执行过滤链
return chain.filter(exchange);
};
}
public static class Config {
// 配置属性,例如自定义头部的值
private String customHeaderValue;
public String getCustomHeaderValue() {
return customHeaderValue;
}
public void setCustomHeaderValue(String customHeaderValue) {
this.customHeaderValue = customHeaderValue;
}
}
}
- 然后,在
application.yml
文件中配置路由和自定义过滤器。
spring:
cloud:
gateway:
routes:
- id: custom_filter_route
uri: http://example.org
filters:
- name: MyCustomFilterFactory
args:
customHeaderValue: MyCustomValue
predicates:
- Path=/custom/**
Global Filters(全局过滤器)
如果你希望过滤器适用于所有的路由,可以创建一个全局过滤器。全局过滤器实现 GlobalFilter
接口,并注册为 Spring Bean。
创建全局过滤器
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
@Order(1) // 设置过滤器的顺序
public class MyGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 在这里添加全局过滤逻辑
exchange.getRequest().mutate().header("X-Global-Header", "GlobalValue").build();
// 继续执行过滤链
return chain.filter(exchange);
}
}
总结
自定义过滤器在 Spring Cloud Gateway 中非常灵活,可以满足各种复杂的业务需求。无论是通过实现 GatewayFilter
接口配置到特定路由,还是通过实现 GlobalFilter
接口应用于全局,都能有效地对请求和响应进行预处理和后处理。