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

java filter response_ZuulFilter中设置Response的原理。相关推荐

  1. 如何在 Java 应用程序中设置 HicariCP 连接池

    在本教程中,我们将介绍 HikariCP 并展示如何在 Java 应用程序中设置 HicariCP 连接池.在我们的应用程序中,我们向 MySQL 数据库发出请求. HikariCP是可靠的高性能 J ...

  2. java postconstruct_spring框架中@PostConstruct的实现原理

    在spring项目经常遇到@PostConstruct注解,首先介绍一下它的用途: 被注解的方法,在对象加载完依赖注入后执行. 此注解是在Java EE5规范中加入的,在Servlet生命周期中有一定 ...

  3. java中的jpa_JPA教程–在Java SE环境中设置JPA

    java中的jpa JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate之类的 ...

  4. JPA教程–在Java SE环境中设置JPA

    JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate的 ORM工具的东西,除了 ...

  5. Springboot中设置response直接在线打开文件

    需求: 前台点击链接,浏览器直接打开文件. 1. 后台代码 /*** 在线浏览文件** @param response 文件流* @throws Exception 流异常*/@ApiModelPro ...

  6. java标签里内容的大小_如何在Java的Frame中设置标签(label )字体大小?

    匿名用户 3级 2011-05-08 回答 import java.awt.Font; import javax.swing.ImageIcon; import javax.swing.JFrame; ...

  7. Java并发包中Semaphore的工作原理、源码分析及使用示例

    简介: 在多线程程序设计中有三个同步工具需要我们掌握,分别是Semaphore(信号量),countDownLatch(倒计数门闸锁),CyclicBarrier(可重用栅栏) 欢迎探讨,如有错误敬请 ...

  8. Java笔记-Spring-rabbitmq中设置receiveMessage参数为Message

    如下代码: public void receiveMessage(Message message){............ } 其中对应的Message为此包: import org.springf ...

  9. java导出excel中设置超链接

    最近项目要求在导出的excel中实现一个可以点击的链接. HSSFWorkbook:这个类包含了读取或写入.xls格式文件的方法.能处理的版本包括 97-2003. HSSFCell cell = r ...

最新文章

  1. 哪些编程语言需要修复?
  2. 阿里云推荐引擎使用教程
  3. nginx负载均衡的策略
  4. 排序算法系列:选择排序算法
  5. ABAP日期函数应用
  6. sql server 怎么把视图中的数据存到另外一张表中_承上篇,自制插件优化Kep数据存储问题...
  7. 使用Maven搭建一个Web项目
  8. java windows 下载_Windows环境下JDK的下载与安装
  9. org.hibernate.QueryTimeoutException: Could not execute JDBC batch update问题解决(转)
  10. 蔡奇视察奇安信:对成功登陆科创板表示祝贺
  11. GB28181协议简介及实践
  12. 接口测试流程和用例设计
  13. 【联想拯救者R7000】蓝牙和wifi图标不显示问题(已解决)
  14. 技嘉ide模式怎么改_bios如何设置为ide兼容模式_怎么进入bios把硬盘模式改成ide
  15. RK3328_LPDDR3D178P132SD4_Template_V11_20170726,RK3328模块原理图和PCB
  16. 认识你7年后终于领证了 2019-09-16
  17. 监控易:2023年ITOM信创市场分析与预测
  18. 第22次CSP认证 第4题 校门外的树(3种方法,非常详细)(类dp+数学)
  19. QtreeView 操作
  20. 淘客网站中系统信息获取

热门文章

  1. CentOS7--MySQL无法启动解决办法
  2. opporeno4和红米k30哪个好
  3. JAVA简易数据连接池Condition
  4. Python购物车案例(改善)
  5. Android系统上的RTSP播放器
  6. js获取图片和视频的宽高等
  7. IDEA中如何配置Git?
  8. vue+django智能点餐系统
  9. 动态词向量之elmo
  10. 来,抱一抱来,背背[图]