Zuul token FIlter 驗證失敗結果輸出
阿新 • • 發佈:2020-07-29
1、背景
用 postman 測試 zuul 閘道器 路由成功和失敗的時候,發現 路由成功的時候,返回的結構體 是 json 格式,但是路由失敗的時候,返回的是空。 結構體居然不一樣,這對呼叫方來說也要瘋了。
趕緊統一結構體。
方法一
檢視路由失敗的程式碼:
/** * 設定 403 無許可權狀態 */ private void setUnauthorizedResponse(RequestContext requestContext) { requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value()); }
趕緊google, 看了一些部落格,都是這樣設定的, 難道他們都不需要 返回的嗎,還是說我專案問題。 立馬 新建一個 專案測試,值新增一個 tokenfilter
@Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value()); return null; }
這時確實返回的空。
@Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value()); ctx.setResponseBody("auth failed"); return null; }
輸出 一段字元。:auth failed.
方法二
正常以為 設定了code, 應該能正常的輸出,居然沒有,就進行debug。
並且 看到篇檔案(ZuulFilter中設定Response的原理。) ,測試 ok。
同時,看到文章中對 Filter的介紹,提到 SendResponseFilter
,對包含 respondBody 的情況 進行結果輸出
@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
return context.getThrowable() == null
&& (!context.getZuulResponseHeaders().isEmpty()
|| context.getResponseDataStream() != null
|| context.getResponseBody() != null);
}
@Override
public Object run() {
try {
addResponseHeaders();
writeResponse();
}
catch (Exception ex) {
ReflectionUtils.rethrowRuntimeException(ex);
}
return null;
}
進行測試,發現ok, 最終 進行 返回結構的統一。
路由失敗的程式碼:
/**
* 設定 403 無許可權狀態
*/
private void setUnauthorizedResponse(RequestContext requestContext) {
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
String result = JSON.toJSONString(new ResultInfo().fail(404, "404", "Forbidden"));
requestContext.setResponseBody(result);
requestContext.getResponse().setContentType("application/json;charset=UTF-8");
}
返回結果:
{
"code": "404",
"msg": "Forbidden",
"ret": 404,
"success": false
}
總結:
setResponseStatusCode
的值 對 filter 進行了過濾- 自定義輸出結果, 需要 設定 ResponseBody。
- 現在是剛用階段,需要深入的去了解下
- 居然有花了2個小時