
Gateway微服务自定义过滤器
网关过滤器有两种,分别是
- GatewayFilter:路由过滤器,作用范围灵活,作用于任意指定的路由
- GlobalFilter:全局过滤器,作用范围是所有路由。
自定义GatewayFilter
自定义GatewayFilter不是直接实现GatewayFilter,而是实现AbstractGatewayFilterFactory。
编写过滤器逻辑
如果过滤器的类名以GatewayFilterFactory结尾,则在配置过滤器的时候可以写前缀。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Component public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> { @Override public GatewayFilter apply(Object config) { return new GatewayFilter() { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 得到请求 ServerHttpRequest request = exchange.getRequest(); // 处理请求 System.out.println("这里模拟请求被处理了"); // 过滤器放行 return chain.filter(exchange); } }; } }
|
配置过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| server: port: 6632 spring: application: name: gateway cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/user/** - id: car-service uri: lb://car-service predicates: - Path=/car/** default-filters: - Custom
|
发起请求,测试过滤器效果

过滤器逻辑成功触发。
增加接受参数功能
实现步骤
- 定义一个内部类Config
- 重写shortcutFieldOrder,getConfigClass方法
- 在配置文件中配置参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| @Component public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.Config> { @Override public GatewayFilter apply(Config config) { return new GatewayFilter() { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 得到请求 ServerHttpRequest request = exchange.getRequest(); // 处理请求 System.out.println(config.getA()); System.out.println(config.getB()); System.out.println(config.getC()); // 过滤器放行 return chain.filter(exchange); } }; }
@Data public static class Config { String a; String b; String c; }
// 将变量名称依次返回,顺序很重要,将来读取参数时需要按顺顺序获取 @Override public List<String> shortcutFieldOrder() { ArrayList<String> fileds = new ArrayList<>(); fileds.add("a"); fileds.add("b"); fileds.add("c"); return fileds; }
// 返回内部config的类型 @Override public Class<Config> getConfigClass() { return Config.class; } }
|
测试效果

成功接收到参数。
自定义GlobalFilter
直接实现GlobalFilter接口即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Component public class MyGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("MyGlobalFilter is running"); return chain.filter(exchange); }
@Override public int getOrder() { // 值越小优先级越高 return 0; } }
|
测试

成功执行