在网上看到一个Zuul过滤器异常后,自定义Response的例子如下:
RequestContext ctx = RequestContext.getCurrentContext();
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody(error.getJSONResponse());
ctx.getResponse().setContentType("application/json;charset=UTF-8");
设置了以上代码,果然起了作用。
于是debug了一翻,找到了渲染的类,原来是
SendResponseFilter :
@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阶段)?但是看日志输出,因该是
没调用才对。
那么在route的几个Filter中是如何执行的呢?
RibbonRoutingFilter
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
return (ctx.getRouteHost() == null && ctx.get(SERVICE_ID_KEY) != null
&& ctx.sendZuulResponse());
}
可以看到因为sendZuulResponse返回false,所以不会被执行了。
还有一个SimpleHostRoutingFilter
@Override
public boolean shouldFilter() {
return RequestContext.getCurrentContext().getRouteHost() != null
&& RequestContext.getCurrentContext().sendZuulResponse();
}
看来一样,也是不会得到执行的。
所以设置了sendZuulResponse(false),就等于对其它过滤器一路开了红灯,都不会被执行了,直到
SendResponseFilter,输出Response的内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。