资讯专栏INFORMATION COLUMN

ZuulFilter中设置Response的原理。

senntyou / 1234人阅读

摘要:于是了一翻,找到了渲染的类,原来是可以看到,这是这个里输出了我设置的内容。还有一个看来一样,也是不会得到执行的。所以设置了就等于对其它过滤器一路开了红灯,都不会被执行了,直到,输出的内容。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68235.html

相关文章

  • zuul实现Cors跨域两种方式(https)

    摘要:大家都知道可以通过实现跨域。第一种方式在服务下添加一个实现跨域,实现起来方便。前端服务和后端服务在同一台服务器上,服务调用服务时,服务通过负载均衡进入服务时时,服务的请求跨域成功,时,服务的请求跨域失败。 大家都知道spring boot 可以通过@CrossOrigin实现跨域。但是在spring cloud 里,如果要粒度那么细的去控制跨域,这个就太繁琐了,所以一般来说,会在路由z...

    wuaiqiu 评论0 收藏0
  • Yii支持多域名cors原理

    摘要:说明测试使用的接口域名,多域名为和。设置多域名尝试直接通过的模块追加值实现,如下接口请求和响应头如下当前域为,需跨域请求的资源。故通过该方法不能设置多域名进行。 首发于 樊浩柏科学院 平常我们遇到跨域问题时,常使用 cors(Cross-origin resource sharin)方式解决。不知你是否注意到,在设置响应头 Access-Control-Allow-Origin 域的...

    Darkgel 评论0 收藏0
  • [Spring cloud 一步步实现广告系统] 3. 网关路由

    摘要:获取当前请求的请求上下文记录请求进入时间需要最后一个执行的后续更新做一个好人。 Zuul(Router and Filter) WIKI: 传送门 showImg(https://i.loli.net/2019/07/24/5d38183f1dff763558.png); 作用 认证,鉴权(Authentication/Security) 预判(Insights) 压力测试(Stre...

    miguel.jiang 评论0 收藏0
  • springCloud学习4(Zuul服务路由)

    摘要:但是如果将负载均衡器置于所有服务前便不是一个好主意,会造成瓶颈。服务超时使用的和库来进行请求。支持以下四种过滤器前置过滤器在将请求发送到目的地之前被调用。通常用于记录从目标服务返回的响应处理错误或审核敏感信息。 showImg(https://segmentfault.com/img/remote/1460000019531578); springcloud 总集:https://ww...

    wuaiqiu 评论0 收藏0
  • JS 跨域原因及其解决方案

    摘要:产生跨域问题的原因跨域问题是浏览器同源策略限制,当前域名的只能读取同域下的窗口属性。比如,其中是协议名,是子域名,是主域名,端口号是,当在在页面中从一个请求数据时,如果这个的协议名子域名主域名端口号任意一个有一个不同,就会产生跨域问题。 产生跨域问题的原因 跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性。 跨域问题产生的场景 当要在在页面中使用js获取其他网...

    voidking 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<