Gateway Filter介紹
Filter,在“pre”類型的過濾器可以做參數校驗、權限校驗、流量監控、日志輸出、協議轉換等,在“post”類型的過濾器中可以做響應內容、響應頭的修改,日志的輸出、流量監控等,有非常重要的作用
Filter除了分為“pre”和“post”兩種方式的Filter外,在Spring Cloud Gateway中,Filter從作用范圍可分為另外兩種,一種是針對於單個路由的Gateway Filter,它在配置文件中的寫法同predict類似;另外一種是針對於所有路由的Global Gateway Filer。現在從作用范圍划分的維度來講解這兩種Filer。
Gateway Filter的使用
1、單個路由的Gateway Filter用法
2、Global Gateway Filer用法
當請求與路由匹配時,過濾Web處理程序會將的所有實例GlobalFilter和所有特定GatewayFilter於路由的實例添加到過濾器鏈中。該組合的過濾器鏈按org.springframework.core.Ordered接口排序,您可以通過實現該getOrder()方法進行設置。
由於Spring Cloud Gateway區分了執行過濾器邏輯的“前”階段和“后”階段,因此優先級最高的過濾器是“前”階段的第一個,而“后”階段的最后一個。
演示項目使用【SpringCloud】Gateway路由配置(十七)節的代碼示例
1)在springcloud-gateway-gateway9527網關模塊中,新建Filter實現接口 GlobalFilter, Ordered
1 @Component 2 @Slf4j 3 public class MyLogGateWayFilter implements GlobalFilter, Ordered { 4 @Override 5 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 6 log.info("=========Come in MyLogGateWayFilter: " + new Date() + "=========="); 7 String uname = exchange.getRequest().getQueryParams().getFirst("uname"); 8 if(uname == null) { 9 log.info("=========用戶名為null,非法用戶========"); 10 exchange.getResponse().setComplete(); 11 } 12 // 成功 13 return chain.filter(exchange); 14 } 15 16 @Override 17 public int getOrder() { 18 return 0; 19 } 20 }
2)測試
a、啟動項目
b、訪問地址:http://localhost:9527/payment/get/1
訪問出錯,日志記錄打印非法用戶
c、訪問地址:http://localhost:9527/payment/get/1?uname=1
正常訪問: