天天看點

【Gateway】網關Gateway全局過濾器和局部過濾器的實作

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]=================
           

繼續閱讀