SpringCloud Zuul(七)之POST Filter
一、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相关推荐
- SpringCloud Zuul 基础入门
SpringCloud Zuul 基础入门 - <重新定义SpringCloud实战>读书笔记系列 Spring Cloud Zuul概述 随着微服务的流行,微服务架构将后端拆解为许多个单 ...
- springcloud学习(七)-Sidecar(多语言支持)
title: springcloud学习(七)-Sidecar(多语言支持) date: 2021-1-28 tags: 微服务 springcloud学习(七)-Sidecar(多语言支持) spr ...
- SpringCloud Zuul(八)之ERROR Filter
一.ERROR Filter 错误过滤器用来处理zuul异常,一般使作为打印异常堆栈.跳转异常页面.转换异常信息格式返回等操作. Zuul已定义的错误过滤器SendErrorFilter,如果Requ ...
- SpringCloud Zuul(六)之PRE Filter
一.PRE Filter 前置过滤器一般用来区分请求来源.转换数据格式.debug日志.校验权限,增加请求装饰标识等待操作. 有一下几个重要方法: (1)filterType 确定过滤器类型 (2)f ...
- zuul如果两个filter的order一样,是如何排序的?
引言 最近有个网友问了一个问题,zuul中如果两个filter的order一样,是如何排序的?引起了我的兴趣,特地去阅读了它的源码. zuul是干什么的 如果你有使用过springcloud应该听说过 ...
- SpringCloud Zuul初体验
文章目录 简介 Zuul服务搭建 后端服务book搭建 创建一个web应用 主程序 配置application.properties 访问book服务 Zuul服务搭建 创建应用 添加一个pre过滤器 ...
- SpringCloud Zuul 网关
目录 网关的概念 搭建zuul网关.实现路由转发 使用zuul过滤请求 使用zuul进行限流 网关的概念 API Gateway 网关,是介于客户端.服务器端之间的中间层,是系统对外的唯一入口,可以统 ...
- springCloud Zuul网关
1.springboot 仅2.0.x 支持,在此选择 2.0.7 2.新建Module eureka-zuul-client 3.导入依赖 <?xml version="1.0&qu ...
- SpringCloud Zuul(一)之介绍
一.zuul官方简介 (1)什么是zuul Zuul是从设备和网站到Netflix流媒体应用程序后端的所有请求的前门.作为边缘服务应用程序,Zuul旨在实现动态路由,监视,弹性和安全性.它还可以根据需 ...
最新文章
- 以下选项不是python打开方式的是-模拟试卷 A
- 树莓派 mysql集群_多树莓派集群服务器
- php对json数据处理,在PHP中处理JSON的后期数据
- 有道难题第一题非OO解,极端记录160ms
- UCloud基于Linux内核新特性的下一代外网网关设计及相关开源工作
- less(css)语言快速入门
- java判断zip包的编码格式_java解压zip包出现乱码
- redis之列表字典操作
- C#使用Newtonsoft.Json读写json、读写Base64图像
- css用户界面样式(附实例、图解)
- python函数可以返回多个函数值吗_python - 函数返回多个值是pythonic吗?
- 【文本识别】CRNN
- Windows 7 安装时候提示,无法更改启动项安装失败,以及msr分区
- 魔板游戏java_Java魔板游戏完整代码及注释
- python实现播放音乐
- 一位IT行业高收入者的理财规划方案
- python 登录新浪微博_Python 模拟登录新浪微博
- Ubuntu22.04 用 `hwclock` 或 `timedatectl` 来设置RTC硬件时钟为本地时区
- sql loader导出数据和导入数据(sqlldr)
- iOS开发- 文件共享 利用iTunes导入文件 并且显示已有文件
热门文章
- 算法设计与分析——算法思想总结
- vector的求和用法accumulate
- Java手写HashSet
- android 那几种动画,Android 动画实现几种方案
- js变量和java变量相等,js中变量和jsp中java代码中变量互相访问解决方案
- [C++11]decltype在泛型编程中的使用举例
- [C++11]字符串原始字面量
- [Java基础]Collections概述和使用
- AcWing 1234. 倍数问题
- oracle sql execute elapsed time,SQL ordered by Elapsed Time 脚本