1. 全局過濾器:
無差别攔截所有經過網關 的請求
實作GlobalFilter接口,可以通過@Order注解或者Ordered接口指定順序(越小優先級越高)
@Component
//@Order(1)//優先級
public class MyGatewayGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("=========All===Request====come=in====Gateway GlobalFilter========By=lin=============== ");
return chain.filter(exchange);
}
/**
* 傳回結果執行優先級,越小優先級越高
*
* @return the order value
* @see #HIGHEST_PRECEDENCE
* @see #LOWEST_PRECEDENCE
*/
@Override
public int getOrder() {
return 0;
}
}
局部過濾器 :
攔截經過網關的特定服務的請求 [例:
AbstractNameValueGatewayFilterFactory
]
1. 編寫
XxxGatewayFilterFactory
實作類
GateWayFilterFactory
接口(也可以繼承抽象類
AbstractGatewayFilterFatory
(推薦))
2. 配置過濾器
配置參數給過濾器,還要實作如下步驟:
3.自定義接收參數的資料模型
3. 繼承
AbstractGatewayFilterFactory
抽象類時,執行泛型
KeyValueConfig
4. 重寫無參構造方法:
supper(KeyValueConfig classs)
5. 重寫shortcutFiledOrder,執行字段順序
如果接收不定數量的參數,還需實作,如下:
6. 重寫shortCutFieldType方法,指定字段類型
//1. 編寫實作類繼承AbstractGatewayFilterFactory抽象類
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.PathsConfig> {//4. 指定泛型,靜态的内部實體類
//5. 重寫無參構造方法,指定内部實體類接收參數
public AuthGatewayFilterFactory() {
super(PathsConfig.class);
}
@Override
public GatewayFilter apply(PathsConfig config) {
System.out.println("=========[apply]========局部過濾器======隻攔截特定的請求==============================");
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// System.out.println("=========[Mono]========局部過濾器======隻攔截特定的請求====="+config.getKey()+"======="+config.getValue()+"=================");
System.out.println("=========[Mono]========局部過濾器======隻攔截特定的請求====="+config.paths+"=================");
return chain.filter(exchange);
}
};
}
/**
* 6. 重寫shortcutFieldOrder()指定接收參數的字段順序
* Returns hints about the number of args and the order for shortcut parsing.
*
* @return the list of hints
*/
@Override
public List<String> shortcutFieldOrder() {
// return Arrays.asList("key", "value");
return Collections.singletonList("paths");
}
/**
* 7. 重寫shortcutType()指定接收參數的字段類型
*/
@Override
public ShortcutType shortcutType() {
return ShortcutType.GATHER_LIST;
}
/**
* 3. 定義匿名内部實體類,定義接收參數的字段
*/
@Data
public static class PathsConfig {
// private String key;
// private String value;
//傳遞多個參數
private List<String> paths;
}
}
#yml配置
gateway:
routes:
- id: xxx-route
uri: lb://xxx-service
predicates:
- Host=www.xxx.com
filters:
- AddRequestHeader=X-Request-red, blue
- Auth=/xxx, /yyy, /zzz# 2. 配置局部過濾器
輸出結果:
=========All===Request====come=in====Gateway GlobalFilter========By=lin===============
=========[Mono]========局部過濾器======隻攔截特定的請求=====[/xxx, /yyy, /zzz]=================