在网上看到一个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