一、POST Filter

后置过滤器一般使用来转换响应数据的格式,截取请求响应数据进行流量录制等操作。

Zuul已定义的后置过滤器SendResponseFilter,将代理请求的响应写入当前响应。

二、自定义后置过滤器

本文自定义后置过滤器用来截取响应体的快照文本发送到kafka存储。

三、实现代码

@Component
@Slf4j
public class PostFilter extends ZuulFilter {//按类型对过滤器进行分类。Zuul中的标准类型是"pre"用于预路由筛选,"route"用于路由到原点,"post"用于后路由筛选,"error"用于错误处理。//我们还支持静态响应的"static"类型请参阅StaticResponseFilter。可以通过调用FilterProcessor.runFilters(type)//后置过滤器必须返回post@Overridepublic String filterType() {return FilterConstants.POST_TYPE;}//必须为过滤器定义filterOrder。如果优先级对筛选器不重要,则过滤器可能具有相同的过滤器顺序//过滤器顺序不需要是连续的@Overridepublic int filterOrder() {return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 10;}//默认情况下,zuulfilter是静态的;它们不携带状态。这可以通过将isStaticFilter属性重写为false来重写@Overridepublic boolean isStaticFilter() {return super.isStaticFilter();}//要禁用此筛选器的Archaius属性的名称。默认情况下,它是zuul.[classname].[filtertype].disable@Overridepublic String disablePropertyName() {return super.disablePropertyName();}//如果为true,则过滤器已被archaius禁用,不会运行@Overridepublic boolean isFilterDisabled() {return super.isFilterDisabled();}//此方法返回的"true"表示应该调用run方法//如果应该调用run方法,则返回true。false不会调用run方法@Overridepublic boolean shouldFilter() {RequestContext context = RequestContext.getCurrentContext();return context.getThrowable() == null&& (!context.getZuulResponseHeaders().isEmpty()|| context.getResponseDataStream() != null|| context.getResponseBody() != null);}//如果shouldFilter方法为true,则将调用此方法。这种方法是ZuulFilter的核心方法//返回一些可以返回的任意工件。当前的实现忽略了它。//如果在执行期间发生错误,则引发ZuulException@Overridepublic Object run() throws ZuulException {RequestContext context = RequestContext.getCurrentContext();InputStream in = null;try {String responseBody = context.getResponseBody();if (responseBody == null) {in = context.getResponseDataStream();ByteArrayOutputStream output = new ByteArrayOutputStream();IOUtils.copy(in, output);byte[] bodyBytes = output.toByteArray();//回填已读的流context.setResponseDataStream(new ByteArrayInputStream(bodyBytes));in = new ByteArrayInputStream(bodyBytes);if (context.getResponseGZipped()) {in = new GZIPInputStream(in);}HttpServletResponse servletResponse = context.getResponse();String endcoding = servletResponse.getCharacterEncoding();if (endcoding == null) {endcoding = "UTF-8";}responseBody = StreamUtils.copyToString(in, Charset.forName(endcoding));}//存储响应数据KafkaUtils.sendResponseDataAsync(context.getRequest().getRequestURI(), responseBody);} catch (Exception e) {log.error("post filter error",e);}finally {if(in!= null){try {in.close();} catch (IOException e) {log.warn("post filter close io error",e);}}}return null;}}

SpringCloud Zuul(七)之POST Filter相关推荐

  1. SpringCloud Zuul 基础入门

    SpringCloud Zuul 基础入门 - <重新定义SpringCloud实战>读书笔记系列 Spring Cloud Zuul概述 随着微服务的流行,微服务架构将后端拆解为许多个单 ...

  2. springcloud学习(七)-Sidecar(多语言支持)

    title: springcloud学习(七)-Sidecar(多语言支持) date: 2021-1-28 tags: 微服务 springcloud学习(七)-Sidecar(多语言支持) spr ...

  3. SpringCloud Zuul(八)之ERROR Filter

    一.ERROR Filter 错误过滤器用来处理zuul异常,一般使作为打印异常堆栈.跳转异常页面.转换异常信息格式返回等操作. Zuul已定义的错误过滤器SendErrorFilter,如果Requ ...

  4. SpringCloud Zuul(六)之PRE Filter

    一.PRE Filter 前置过滤器一般用来区分请求来源.转换数据格式.debug日志.校验权限,增加请求装饰标识等待操作. 有一下几个重要方法: (1)filterType 确定过滤器类型 (2)f ...

  5. zuul如果两个filter的order一样,是如何排序的?

    引言 最近有个网友问了一个问题,zuul中如果两个filter的order一样,是如何排序的?引起了我的兴趣,特地去阅读了它的源码. zuul是干什么的 如果你有使用过springcloud应该听说过 ...

  6. SpringCloud Zuul初体验

    文章目录 简介 Zuul服务搭建 后端服务book搭建 创建一个web应用 主程序 配置application.properties 访问book服务 Zuul服务搭建 创建应用 添加一个pre过滤器 ...

  7. SpringCloud Zuul 网关

    目录 网关的概念 搭建zuul网关.实现路由转发 使用zuul过滤请求 使用zuul进行限流 网关的概念 API Gateway 网关,是介于客户端.服务器端之间的中间层,是系统对外的唯一入口,可以统 ...

  8. springCloud Zuul网关

    1.springboot 仅2.0.x 支持,在此选择 2.0.7 2.新建Module eureka-zuul-client 3.导入依赖 <?xml version="1.0&qu ...

  9. SpringCloud Zuul(一)之介绍

    一.zuul官方简介 (1)什么是zuul Zuul是从设备和网站到Netflix流媒体应用程序后端的所有请求的前门.作为边缘服务应用程序,Zuul旨在实现动态路由,监视,弹性和安全性.它还可以根据需 ...

最新文章

  1. 以下选项不是python打开方式的是-模拟试卷 A
  2. 树莓派 mysql集群_多树莓派集群服务器
  3. php对json数据处理,在PHP中处理JSON的后期数据
  4. 有道难题第一题非OO解,极端记录160ms
  5. UCloud基于Linux内核新特性的下一代外网网关设计及相关开源工作
  6. less(css)语言快速入门
  7. java判断zip包的编码格式_java解压zip包出现乱码
  8. redis之列表字典操作
  9. C#使用Newtonsoft.Json读写json、读写Base64图像
  10. css用户界面样式(附实例、图解)
  11. python函数可以返回多个函数值吗_python - 函数返回多个值是pythonic吗?
  12. 【文本识别】CRNN
  13. Windows 7 安装时候提示,无法更改启动项安装失败,以及msr分区
  14. 魔板游戏java_Java魔板游戏完整代码及注释
  15. python实现播放音乐
  16. 一位IT行业高收入者的理财规划方案
  17. python 登录新浪微博_Python 模拟登录新浪微博
  18. Ubuntu22.04 用 `hwclock` 或 `timedatectl` 来设置RTC硬件时钟为本地时区
  19. sql loader导出数据和导入数据(sqlldr)
  20. iOS开发- 文件共享 利用iTunes导入文件 并且显示已有文件

热门文章

  1. 算法设计与分析——算法思想总结
  2. vector的求和用法accumulate
  3. Java手写HashSet
  4. android 那几种动画,Android 动画实现几种方案
  5. js变量和java变量相等,js中变量和jsp中java代码中变量互相访问解决方案
  6. [C++11]decltype在泛型编程中的使用举例
  7. [C++11]字符串原始字面量
  8. [Java基础]Collections概述和使用
  9. AcWing 1234. 倍数问题
  10. oracle sql execute elapsed time,SQL ordered by Elapsed Time 脚本