spring cloud中zuul 實現過濾器操作

一.基礎知識

Spring Cloud中默認已經爲Zuul編寫並啓用了一些過濾器,這些過濾器都在spring-cloud-netflix-zuul這個Jar包的org.springframework.cloud.netflix.zuul.filters包中。

要實現Zuul的過濾器,就需要繼承ZuulFilter的父類,實現filterType()、filterOrder()、shouldFilter()以及run()方法

(1)filterType()方法爲獲取該過濾器的類型
通過“FilterConstants”類中的Type常量,我們可以知曉,Zuul的標準過濾器一共有“error”、“post”、“pre”和“route”的類型:

PRE:這種過濾器在請求被路由之前調用。可利用這種過濾器實現身份驗證、在集羣中選擇請求的微服務,記錄調試信息等。
ROUTING:這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache?HttpClient或Netflix?Ribbon請求微服務。
POST:這種過濾器在路由到微服務以後執行。這種過濾器可用來爲響應添加標準的HTTP header、收集統計信息和指標、將響應從微服務發送給客戶端等。
ERROR:在其他階段發送錯誤時執行該過濾器

(2)filterOrder()方法爲獲取過濾器在責任鏈中的順序,其中數值越大,越後執行;
這裏各個filter之間不直接進行交互,而是通過RequestContext來共享狀態信息。
(3)shouldFilter()方法獲取是否需要執行該過濾
(4)run()方法就是該過濾器的具體過濾邏輯的執行
總結:如果我們要自定義Zuul的Filter過濾器,繼承ZuulFilter父類,並實現以上四個方法即可。Zuul會動態的讀取,編譯,運行新添加的filter。

二、編寫Zuul的自定義過濾器

實現要求:查詢如果是輸入id,則正確通過,如果查實輸入的是字符china,則過濾掉,不讓其通過。

修改項目:ms-zuul-consumer在項目中新增一個過濾器

1.ChineseCharacterFilter過濾器:

package com.ljf.weifuwu.springcloud.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;

public class ChineseCharacterFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";//類型爲p
    }

    @Override
    public int filterOrder() {
        return 1;//過濾器排序爲1號
    }

    /**
     * 判斷是否執行該過濾器
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;//執行該過濾器
    }

    @Override
    public Object run() {
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
         String URI = request.getRequestURI();
              if(URI.contains("/eureka-provider/")) {
                //獲取RESTful風格請求URI"/user/findById/1" 中的“1"
                    String userName = URI.split("/")[3];
                   if(!StringUtils.isEmpty(userName)&&"china".equals(userName)) {
                        System.out.println("請求了UserId爲"+userName+"的用戶,有風險!!!");
                     }else {
                          System.out.println("請求了UserId不爲china的用戶,無風險~~");
                       }
                     }
             return null;


    }
}

  2.在啓動類註冊該類的實例bean:

    /**
     * 返回bean
     * @return
     */
    @Bean
    public ChineseCharacterFilter riskCheckFilter() {
        return new ChineseCharacterFilter();
    }

3.啓動服務:ms-eureka-center(8761)、ms-eureka-provider(7901)、ms-zuul-consumer(8008) 

4.訪問:

http://localhost:8008/user-zuul/eureka-provider/1

http://localhost:8008/user-zuul/eureka-provider/china

 

 

三、禁用Zuul的Filter過濾器 

需要對Zuul的某些過濾器進行禁用,我們只需要在配置文件中,通過以下格式來禁用某個過濾器即可:
zuul.<SimpleClassName>.<filterType>.disable=true

如本案例:zuul.ChineseCharacterFilter.pre.disable=ture

注意:標紅的部分,需要根據情況動態調整。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章