Zuul token FIlter 驗證失敗結果輸出
- 2020 年 7 月 29 日
- 筆記
- filter 自定義結果, zuul, 點滴積累
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個小時