java filter response_ZuulFilter中设置Response的原理。

在网上看到一个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的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值