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的内容。
java filter response_ZuulFilter中设置Response的原理。相关推荐
- 如何在 Java 应用程序中设置 HicariCP 连接池
在本教程中,我们将介绍 HikariCP 并展示如何在 Java 应用程序中设置 HicariCP 连接池.在我们的应用程序中,我们向 MySQL 数据库发出请求. HikariCP是可靠的高性能 J ...
- java postconstruct_spring框架中@PostConstruct的实现原理
在spring项目经常遇到@PostConstruct注解,首先介绍一下它的用途: 被注解的方法,在对象加载完依赖注入后执行. 此注解是在Java EE5规范中加入的,在Servlet生命周期中有一定 ...
- java中的jpa_JPA教程–在Java SE环境中设置JPA
java中的jpa JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate之类的 ...
- JPA教程–在Java SE环境中设置JPA
JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate的 ORM工具的东西,除了 ...
- Springboot中设置response直接在线打开文件
需求: 前台点击链接,浏览器直接打开文件. 1. 后台代码 /*** 在线浏览文件** @param response 文件流* @throws Exception 流异常*/@ApiModelPro ...
- java标签里内容的大小_如何在Java的Frame中设置标签(label )字体大小?
匿名用户 3级 2011-05-08 回答 import java.awt.Font; import javax.swing.ImageIcon; import javax.swing.JFrame; ...
- Java并发包中Semaphore的工作原理、源码分析及使用示例
简介: 在多线程程序设计中有三个同步工具需要我们掌握,分别是Semaphore(信号量),countDownLatch(倒计数门闸锁),CyclicBarrier(可重用栅栏) 欢迎探讨,如有错误敬请 ...
- Java笔记-Spring-rabbitmq中设置receiveMessage参数为Message
如下代码: public void receiveMessage(Message message){............ } 其中对应的Message为此包: import org.springf ...
- java导出excel中设置超链接
最近项目要求在导出的excel中实现一个可以点击的链接. HSSFWorkbook:这个类包含了读取或写入.xls格式文件的方法.能处理的版本包括 97-2003. HSSFCell cell = r ...
最新文章
- 哪些编程语言需要修复?
- 阿里云推荐引擎使用教程
- nginx负载均衡的策略
- 排序算法系列:选择排序算法
- ABAP日期函数应用
- sql server 怎么把视图中的数据存到另外一张表中_承上篇,自制插件优化Kep数据存储问题...
- 使用Maven搭建一个Web项目
- java windows 下载_Windows环境下JDK的下载与安装
- org.hibernate.QueryTimeoutException: Could not execute JDBC batch update问题解决(转)
- 蔡奇视察奇安信:对成功登陆科创板表示祝贺
- GB28181协议简介及实践
- 接口测试流程和用例设计
- 【联想拯救者R7000】蓝牙和wifi图标不显示问题(已解决)
- 技嘉ide模式怎么改_bios如何设置为ide兼容模式_怎么进入bios把硬盘模式改成ide
- RK3328_LPDDR3D178P132SD4_Template_V11_20170726,RK3328模块原理图和PCB
- 认识你7年后终于领证了 2019-09-16
- 监控易:2023年ITOM信创市场分析与预测
- 第22次CSP认证 第4题 校门外的树(3种方法,非常详细)(类dp+数学)
- QtreeView 操作
- 淘客网站中系统信息获取