1. 内置过滤器
filters:
- RedirectTo=302, http://baidu.com
2. 自定义 GatewayFilter Factory
application.yml 配置
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: concrete-service=
uri: lb://concrete-service
predicates:
- Path=/user/**
filters:
# - RedirectTo=302, http://baidu.com
- name: CheckAuth # 过滤器名称
args:
name: this is my test
enabled: true
另一种简写方式,需要重写 shortcutFieldOrder()
filters:
- CheckAuth=this is my test, true
// 指定参数顺序和数量
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("name", "enabled");
}
自定义过滤器 CheckAuth
/**
* 命名以 GatewayFilterFactory 结尾
* 名称是 CheckAuth
*/
@Component
public class CheckAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {
public CheckAuthGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
System.out.println("读取配置:" + config.getName());
ServerHttpRequest request = exchange.getRequest().mutate().build();
return chain.filter(exchange.mutate().request(request).build());
};
}
// 自定义配置类
public static class Config {
private String name;
private boolean enabled;
// Getter/Setter
}
}
GatewayFilter 类分析
public interface GatewayFilter extends ShortcutConfigurable {
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
// 重写 apply()
@Override
public GatewayFilter apply(Config config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return null;
}
};
}
3. 全局过滤器
- 全局过滤器作用于所有的路由,可以统一处理业务需求,比如权限认证、IP访问限制
- 使用 @Order 指定顺序,数字越小,优先级越高
@Configuration
@Slf4j
public class GlobalConfiguration {
@Bean
@Order(0)
public GlobalFilter first() {
return (exchange, chain) -> {
log.info("pre first...");
return chain.filter(exchange).then(Mono.fromRunnable(() -> log.info("post first...")));
};
}
@Bean
@Order(1)
public GlobalFilter second() {
return (exchange, chain) -> {
log.info("pre second...");
return chain.filter(exchange).then(Mono.fromRunnable(() -> log.info("post second...")));
};
}
}
打印结果
2023-01-06 13:12:05.947 INFO 42296 --- [ctor-http-nio-2] c.e.c.g.config.GlobalConfiguration : pre first...
2023-01-06 13:12:05.949 INFO 42296 --- [ctor-http-nio-2] c.e.c.g.config.GlobalConfiguration : pre second...
2023-01-06 13:12:05.957 INFO 42296 --- [ctor-http-nio-2] c.e.c.g.config.GlobalConfiguration : post second...
2023-01-06 13:12:05.957 INFO 42296 --- [ctor-http-nio-2] c.e.c.g.config.GlobalConfiguration : post first...
3.1 前置全局过滤器
- 请求执行之前
@Component
@Slf4j
public class PreGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
HttpHeaders headers = exchange.getRequest().getHeaders();
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
log.info(JSON.toJSONString(queryParams));
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
3.2 后置全局过滤器
- 在调用链执行完成之后执行
@Component
@Slf4j
public class PostGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange)
.then(Mono.fromRunnable(() -> log.info("post run...")));
}
@Override
public int getOrder() {
return 0;
}
}
3.3 前置过滤器和后置过滤器组合在一起
@Component
@Slf4j
public class PostGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
if (queryParams.containsKey("message")) {
log.info("前置处理");
ServerHttpResponse response = exchange.getResponse();
DataBuffer dataBuffer = response.bufferFactory().wrap("pre-run".getBytes(StandardCharsets.UTF_8));
return response.writeWith(Mono.just(dataBuffer));
}
return chain.filter(exchange)
.then(Mono.fromRunnable(() -> log.info("post run...")));
}
@Override
public int getOrder() {
return 0;
}
}
请求地址 http://localhost:8010/user/query?message=Hello









网友评论