ZuulFilter中設置Response的原理。

在網上看到一個Zuul過濾器異常後,自定義Response的例子以下:java

RequestContext ctx = RequestContext.getCurrentContext();
    ctx.setSendZuulResponse(false);
    ctx.setResponseStatusCode(401);
    ctx.setResponseBody(error.getJSONResponse());
    ctx.getResponse().setContentType("application/json;charset=UTF-8");

設置了以上代碼,果真起了做用。json

因而debug了一翻,找到了渲染的類,原來是
SendResponseFilter :app

@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;
    }

能夠看到,這是這個Filter裏輸出了我設置的內容。
不過SendResponseFilter是post階段的filter啊,我是在pre階段設置的,
那麼Zuul中負責執行調用邏輯的Filter難道都執行了(route階段)?可是看日誌輸出,因該是
沒調用纔對。ide

那麼在route的幾個Filter中是如何執行的呢?post

RibbonRoutingFilterdebug

@Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        return (ctx.getRouteHost() == null && ctx.get(SERVICE_ID_KEY) != null
                && ctx.sendZuulResponse());
    }

能夠看到由於sendZuulResponse返回false,因此不會被執行了。日誌

還有一個SimpleHostRoutingFiltercode

@Override
    public boolean shouldFilter() {
        return RequestContext.getCurrentContext().getRouteHost() != null
                && RequestContext.getCurrentContext().sendZuulResponse();
    }

看來同樣,也是不會獲得執行的。get

因此設置了sendZuulResponse(false),就等於對其它過濾器一路開了紅燈,都不會被執行了,直到
SendResponseFilter,輸出Response的內容。it

相關文章
相關標籤/搜索