目標(biāo)
- 學(xué)習(xí)Zuul過(guò)濾器使用
- filter配置說(shuō)明
自定義filter實(shí)現(xiàn)
api模塊增加MyFilter腕铸,用于accessToken請(qǐng)求參數(shù)校驗(yàn)
@Component
public class MyFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
System.out.println(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
Object accessToken = request.getParameter("accessToken");
if(accessToken == null) {
System.out.println("access token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return null;
}
System.out.println("access token ok");
return null;
}
}
重啟api模塊
訪問(wèn) http://localhost:6001/account/userInfo
日志輸出
GET request to http://localhost:6001/account/userInfo
access token is empty
訪問(wèn) http://localhost:6001/account/userInfo?accessToken=testToken
日志輸出
GET request to http://localhost:6001/account/userInfo
access token ok
filter配置說(shuō)明
filterType
- pre:可以在請(qǐng)求被路由之前調(diào)用
- route:在路由請(qǐng)求時(shí)候被調(diào)用
- post:在route和error過(guò)濾器之后被調(diào)用
- error:處理請(qǐng)求時(shí)發(fā)生錯(cuò)誤時(shí)被調(diào)用
如論如何,post類型的過(guò)濾器總是會(huì)被調(diào)用
filterOrder
通過(guò)int值來(lái)定義過(guò)濾器的執(zhí)行順序
shouldFilter
返回一個(gè)boolean類型來(lái)判斷該過(guò)濾器是否要執(zhí)行,所以通過(guò)此函數(shù)可實(shí)現(xiàn)過(guò)濾器的開(kāi)關(guān)割按。在上例中,我們直接返回true,所以該過(guò)濾器總是生效
run
過(guò)濾器的具體邏輯
需要注意,這里我們通過(guò)ctx.setSendZuulResponse(false)令zuul過(guò)濾該請(qǐng)求懂诗,不對(duì)其進(jìn)行路由,然后通過(guò)ctx.setResponseStatusCode(401)設(shè)置了其返回的錯(cuò)誤碼