1. 程式人生 > 實用技巧 >Zuul token FIlter 驗證失敗結果輸出

Zuul token FIlter 驗證失敗結果輸出

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個小時