文章目录
- GlobalFilter(代表全局过滤器)
- GatewayFilter(代表路由过滤器)
- GlobalFilterAdapter(适配器关键)
- 测试类
- 执行结果
在SpringCloud Gateway中有两个不同的过滤器接口,分别是GatewayFilter和GlobalFilter。
- GlobalFilter:全局过滤器。不需要再配置文件中配置,作用在所有的路由上。
- GatewayFilter:路由过滤器。网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上。
在源码中可以看到,两个不同类型的接口,且在没有实现一个公共接口的前提下,能放到同一个combined集合中。这里使用的就是一个适配器模式。
用一个简单的demo记录下对应适配器模式的写法。
更多源码细节,参考gateway源码中的类:org.springframework.cloud.gateway.handler.FilteringWebHandler
GlobalFilter(代表全局过滤器)
public interface GlobalFilter {
void filter();
}
class GlobalFilter1 implements GlobalFilter{
@Override
public void filter() {
System.out.println("GlobalFilter1");
}
}
class GlobalFilter2 implements GlobalFilter{
@Override
public void filter() {
System.out.println("GlobalFilter2");
}
}
GatewayFilter(代表路由过滤器)
public interface GatewayFilter {
void filter();
}
class GatewayFilter1 implements GatewayFilter{
@Override
public void filter() {
System.out.println("GatewayFilter1");
}
}
class GatewayFilter2 implements GatewayFilter{
@Override
public void filter() {
System.out.println("GatewayFilter2");
}
}
class GatewayFilter3 implements GatewayFilter{
@Override
public void filter() {
System.out.println("GatewayFilter3");
}
}
GlobalFilterAdapter(适配器关键)
将GatewayFilter适配成GlobalFilter
public class GlobalFilterAdapter implements GlobalFilter{
private GatewayFilter delegate;
@Override
public void filter() {
delegate.filter();
}
// 待适配的接口作为参数,外部统一调用GlobalFilter的filter方法。
// 但是适配之后的接口,则是通过delegate属性调用真实的GatewayFilter的方法
public GlobalFilterAdapter(GatewayFilter delegate) {
this.delegate = delegate;
}
}
测试类
public class Test {
public static void main(String[] args) {
List<GatewayFilter> gatewayFilterList = new ArrayList<>();
gatewayFilterList.add(new GatewayFilter1());
gatewayFilterList.add(new GatewayFilter2());
gatewayFilterList.add(new GatewayFilter3());
// 全部的需要执行的数据
List<GlobalFilter> globalFilters = new ArrayList<>();
globalFilters.add(new GlobalFilter1());
globalFilters.add(new GlobalFilter2());
List<GlobalFilterAdapter> globalFilterAdapters = gatewayFilterList.stream()
.map(GlobalFilterAdapter::new)
.collect(Collectors.toList());
globalFilters.addAll(globalFilterAdapters);
// 调用list中所有的过滤方法
for (GlobalFilter globalFilter : globalFilters) {
globalFilter.filter();
}
}
}