有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`
1、实现 GatewayFilter 接口
GatewayFilter 一般作用在某一个路由上,需要实例化创建才能使用,局部过滤器需要实现接口GatewayFilter、Ordered
。
创建 com.itheima.filter.PayFilter
代码如下:
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
| public class PayFilter implements GatewayFilter,Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("GatewayFilter 拦截器执行 ---pre-----PayFilter");
return chain.filter(exchange).then(Mono.fromRunnable(()->{
System.out.println("GatewayFilter 拦截器执行 ---post-----PayFilter");
}));
}
@Override
public int getOrder() {
return 0;
}
}
|
使用局部过滤器:(使用下面 RouteLocator 的时候,配置文件中的路由记得注释或删除)
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 43 44 45
|
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("hailtaxi-driver", r -> r.path("/api/driver/**")
.and().cookie("username","itheima")
.and().header("token","123456")
.filters(f->f.filter(new PayFilter()).addResponseHeader("X-Response-Default-MyName", "itheima")
.addRequestHeader("myheader", "1234567")
.stripPrefix(1)
)
.uri("lb://hailtaxi-driver")
)
.route("hailtaxi-order", r -> r.path("/order/**").uri("lb://hailtaxi-order"))
.route("hailtaxi-pay", r -> r.path("/pay/**").uri("lb://hailtaxi-pay"))
.build();
}
|
为了更好看到效果,我们在 RouterFilter
添加 System.out.println("GlobalFilter 拦截器执行 ");
再访问测试。
访问:http://localhost:8001/api/driver/info/1,注意使用 postman 发送请求时添加请求头,添加 cookie。
继承 GatewayFilterFactory
如果定义局部过滤器,想在配置文件中进行配置来使用,可以继承 AbstractGatewayFilterFactory<T>
抽象类或者AbstractNameValueGatewayFilterFactory
整个体系结构为:![image.png](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
这两个抽象类的区别就是前者接收一个参数(像 StripPrefix 和我们创建的这种),后者接收两个参数(像 AddResponseHeader)
代码的编写可以参考:StripPrefixGatewayFilterFactory
和 AddRequestHeaderGatewayFilterFactory
过滤器工厂默认命名规则必须按照”名称”+GatewayFilterFactory,如上 StripPrefixGatewayFilterFactory 的过滤器名称为 StripPrefix** **2.1、继承
AbstractGatewayFilterFactory`
需求:
在网关中统一支付方式,编写一个过滤器:PayMethodGatewayFilterFactory
,
1、编写过滤器
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| @Slf4j
@Component
public class PayMethodGatewayFilterFactory extends AbstractGatewayFilterFactory<PayMethodGatewayFilterFactory.Config> {
public PayMethodGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
String paymethod = config.getPayMethod();
String msg = config.getMsg();
log.info("PayMethodGatewayFilterFactory 加载到的配置信息为:{}---{}",paymethod,msg);
exchange.getRequest().mutate().header("paymethod",paymethod);
return chain.filter(exchange);
};
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("payMethod","msg");
}
@Override
public ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}
@Data
public static class Config {
private String payMethod;
private String msg;
}
}
|
2、配置文件中使用如下:
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
| gateway:
routes:
- id: hailtaxi-driver
uri: lb://hailtaxi-driver
predicates:
- Path=/driver/**
- Cookie=username,itheima
- Header=token,^(?!\d+$)[\da-zA-Z]+$
- Method=GET,POST
- Token=Authorization
filters:
- PayMethod=alipay, 业务整合
|
再次测试,查看 hailtaxi-driver 服务接收到请求后是否多了 paymethod
请求头信息
2.2、继承AbstractNameValueGatewayFilterFactory
直接查看 AddRequestHeaderGatewayFilterFactory
源码,分析即可!