一.基礎知識
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
注意:標紅的部分,需要根據情況動態調整。