Spring Cloud融合gateway自带GatewayFilter使用 | Spring Cloud 15
一、Spring Cloud Gateway内置GatewayFilter
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。
官网地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
| 过滤器工厂 | 作用 | 参数 |
|---|---|---|
| AddRequestHeader | 为原始请求添加Header | Header的名称及值 |
| AddRequestParameter | 为原始请求添加请求参数 | 参数名称及值 |
| AddResponseHeader | 为原始响应添加Header | Header的名称及值 |
| DedupeResponseHeader | 剔除响应头中重复的值 | 需要去重的Header名称及去重策略 |
| Hystrix | 为路由引入Hystrix的断路器保护 | HystrixCommand的名称 |
| FallbackHeaders | 为fallbackUri的请求头中添加具体的异常信息 | Header的名称 |
| PrefixPath | 为原始请求路径添加前缀 | 前缀路径 |
| PreserveHostHeader | 为请求添加一个preserveHostHeader=true 的属性,路由过滤器会检查该属性以决定是否要发送原始的Host | 无 |
| RequestRateLimiter | 用于对请求限流,限流算法为令牌桶 | keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus |
| RedirectTo | 将原始请求重定向到指定的URL | http状态码及重定向的url |
| RemoveHopByHopHeadersFilter | 为原始请求删除IETF组织规定的一系列Header | 默认就会启用,可以通过配置指定仅删除哪些Header |
| RemoveRequestHeader | 为原始请求删除某个Header | Header名称 |
| RemoveResponseHeader | 为原始响应删除某个Header | Header名称 |
| RewritePath | 重写原始的请求路径 | 原始路径正则表达式以及重写后路径的正则表达式 |
| RewriteResponseHeader | 重写原始响应中的某个Header | Header名称、值的正则表达式,重写后的值 |
| SaveSession | 在转发请求之前,强制执行WebSession::save操作 | 无 |
| secureHeaders | 为原始响应添加一系列起安全作用的响应头 | 无,支持修改这些安全响应头的值 |
| SetPath | 修改原始的请求路径 | 修改后的路径 |
| SetResponseHeader | 修改原始响应中某个Header的值 | Header名称,修改后的值 |
| SetStatus | 修改原始响应的状态码 | HTTP 状态码,可以是数字,也可以是字符串 |
| StripPrefix | 用于截断原始请求的路径 | 使用数字表示要截断的路径的数量 |
| Retry | 针对不同的响应进行重试 | retries、statuses、methods、series |
| RequestSize | 设置允许接收最大请求包的大 小。如果请求包大小超过设置的值,则返回 413 Payload Too Large | 请求包大小,单位为字节,默认值为5M |
| ModifyRequestBody | 在转发请求之前修改原始请求体内容 | 修改后的请求体内容 |
| ModifyResponseBody | 修改原始响应体的内容 | 修改后的响应体内容 |
二、DefaultFilter
添加DefaultFilter将其应用于所有路由,您可以使用spring.cloud.gateway.default-filters,此属性配置采用DefaultFilter列表。
spring:cloud:gateway:default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue- StripPrefix=1
三、GlobalFilter
GlobalFilter接口与GatewayFilter接口具有相同特征。GlobalFilter是有条件地应用于所有路由的特殊过滤器。
Spring Cloud Gateway 内置的GatewayFilter:

更多介绍请见官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters
以下为自定义GlobalFilter实现记录请求方状态及耗时:
ApiLoggingFilter.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;@Slf4j
public class ApiLoggingFilter implements GlobalFilter, Ordered {private static final String START_TIME = "startTime";private static final String X_REAL_IP = "X-Real-IP";// nginx需要配置@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {if (log.isDebugEnabled()) {String info = String.format("Method:{%s} Host:{%s} Path:{%s} Query:{%s}",exchange.getRequest().getMethod().name(), exchange.getRequest().getURI().getHost(),exchange.getRequest().getURI().getPath(), exchange.getRequest().getQueryParams());log.debug(info);}exchange.getAttributes().put(START_TIME, System.currentTimeMillis());return chain.filter(exchange).then(Mono.fromRunnable(() -> {Long startTime = exchange.getAttribute(START_TIME);if (startTime != null) {Long executeTime = (System.currentTimeMillis() - startTime);List<String> ips = exchange.getRequest().getHeaders().get(X_REAL_IP);String ip = ips != null ? ips.get(0) : exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();String api = exchange.getRequest().getURI().getRawPath();int code = 500;if (exchange.getResponse().getStatusCode() != null) {code = exchange.getResponse().getStatusCode().value();}// 当前仅记录日志,后续可以添加日志队列,来过滤请求慢的接口if (log.isDebugEnabled()) {log.debug("来自IP地址:{}的请求接口:{},响应状态码:{},请求耗时:{}ms", ip, api, code, executeTime);}}}));}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}}
配置使用ApiLoggingFilter:
GatewayConfiguration.java
@Configuration(proxyBeanMethods = false)
public class GatewayConfiguration {@Beanpublic ApiLoggingFilter apiLoggingFilter() {return new ApiLoggingFilter();}
}
四、过滤器的执行顺序
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter。
请求路由后,会将 当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,按org.springframework.core.Ordered接口排序,排序后依次执行每个过滤器:

排序的规则是什么呢?
- 每一个过滤器都必须指定一个
int类型的order值,order值越小,优先级越高,执行顺序越靠前。 GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定。路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。- 当过滤器的
order值一样时,会按照defaultFilter>路由过滤器>GlobalFilter的顺序执行。 - 传入的
HTTP请求的第一个过滤器具有最高优先级。 - 传出的
HTTP响应的最后一个过滤器具有最高优先级。
详细内容,可以查看源码:
org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加载defaultFilters,然后再加载某个route的filters,然后合并。
private List<GatewayFilter> getFilters(RouteDefinition routeDefinition) {List<GatewayFilter> filters = new ArrayList();if (!this.gatewayProperties.getDefaultFilters().isEmpty()) {filters.addAll(this.loadGatewayFilters(routeDefinition.getId(), new ArrayList(this.gatewayProperties.getDefaultFilters())));}if (!routeDefinition.getFilters().isEmpty()) {filters.addAll(this.loadGatewayFilters(routeDefinition.getId(), new ArrayList(routeDefinition.getFilters())));}AnnotationAwareOrderComparator.sort(filters);return filters;
}
org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法会加载全局过滤器,与前面的过滤器合并后根据order排序,组织过滤器链。
public Mono<Void> handle(ServerWebExchange exchange) {Route route = (Route)exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);List<GatewayFilter> gatewayFilters = route.getFilters();List<GatewayFilter> combined = new ArrayList(this.globalFilters);combined.addAll(gatewayFilters);AnnotationAwareOrderComparator.sort(combined);if (logger.isDebugEnabled()) {logger.debug("Sorted gatewayFilterFactories: " + combined);}return (new DefaultGatewayFilterChain(combined)).filter(exchange);
}
相关文章:
Spring Cloud融合gateway自带GatewayFilter使用 | Spring Cloud 15
一、Spring Cloud Gateway内置GatewayFilter 路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。 官网地址:https://docs.spring.io/spring-cloud-gateway…...
SVN 版本控制软件
SVN 版本控制软件 属于C/S结构软件(客户端与服务端) 服务端软件:VisualSVN 网址:Downloads | VisualSVN 下载好:VisualSVN-Server-5.1.3-x64.msi 客户端软件:TortoiseSVN 网址:http://tor…...
全流程基于最新导则下的生态环境影响评价技术方法及图件制作与案例
目录 专题一、生态环境影响评价框架及流程 专题二、基于遥感解译的土地利用现状图的编制 专题三、生物多样性测定及R语言分析 专题四、植被类型及植被覆盖度图的编制 专题五、生物量与净初级生产力测定:实测及模型 专题六、生态系统类型及服务价值评估 专题七…...
(蓝桥真题)分果果(动态规划)
题目链接:P8746 [蓝桥杯 2021 省 A] 分果果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 样例1输入: 5 2 6 1 2 7 9 样例1输出: 0 样例2输入: 5 5 6 1 2 7 9 样例2输出: 2 分析:这道题的状态表…...
【CSS】CSS 背景设置 ① ( 背景颜色 | 背景图片 | 背景平铺 )
文章目录一、背景颜色1、语法说明2、代码示例二、背景图片1、语法说明2、代码示例三、背景平铺一、背景颜色 1、语法说明 CSS 的背景颜色样式语法 : 默认的背景颜色是 transparent 透明 ; background-color:颜色值;background-color 属性 可以 定义 文本颜色 , 其颜色值有三种…...
uniCloud基础使用
获取openID云函数use strict; exports.main async (event, context) > {//event为客户端上传的参数console.log(event : , event)// jscode2session 微信小程序登录接口,获取openidconst {code} event;// 云函数中如需要请求其他http服务,则使用uni…...
5、Elasticsearch优化
一、Elasticsearch集群配置 1、硬件选择 Elasticsearch的基础是 Lucene ,所有的索引和文档数据是存储在本地的磁盘中, 具体的路径可在 ES 的配置文件 ../config/elasticsearch.yml 中配置,如下:磁盘在现代服务器上通常都是瓶颈。…...
地质灾害防治单位资质
地质灾害危险性评估,是指在地质灾害易发区进行工程建设或者编制地质灾害易发区内的国土空间规划时,对建设工程或者规划区遭受山体崩塌、滑坡、泥石流、地面塌陷、地裂缝、地面沉降等地质灾害的可能性和建设工程引发地质灾害的可能性作出评估,…...
打怪升级之发送单个UDP包升级版
目标 1.message的输入由edit_control进行,需要捕获输入。 2.用户的主机地址和发送地址不一样,需要分别设置并绑定。 设计RC外观 必备组件:主机IP与端口,从机IP与端口,消息框,发送,连接按钮。…...
MyBatis开发
MyBatis开发入门搭建MyBatis框架开发环境在自己建的的项目建立个lib文件然后导入包3.两个jar包部署到项目中和为项目添加测试类库4.配置数据库mybatis-config.xml里面的配置:<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE config…...
excel 数据查询,几个模式化公式请收好
1、一对多查询 所谓一对多,就是符合某个指定条件的有多个结果,要把这些结果都提取出来。 如下图所示,希望根据F2单元格中指定的部门,提取出左侧列表中“生产部”的所有人员姓名。 Excel 2019及以下版本:在H2单元格输…...
Prometheus MySQL 性能监控
一、 介绍 Prometheus 是一种开源的监控系统和时序数据库,旨在收集和处理大量数据并提供可视化、监控警报等功能。它支持多种语言、多种部署方式,并且非常灵活,而且社区支持非常活跃,为用户提供了很多优秀的解决方案。 MySQL 是一…...
刷题记录:牛客NC24261[USACO 2019 Feb G]Cow Land
传送门:牛客 题目描述 Cow Land 总共有 NNN 个不同的景点( 2≤N≤1052 \leq N \leq 10^52≤N≤105 )。 一共有 n−1n-1n−1 条道路连接任意两个景点,这意味着任意两个景点间只有一条简单路径。 每个景点 iii 都有一个享受值 eie_iei &…...
MYSQL开发误区
一、表、列、索引设计误区 1、现象:在线业务系统出现了三张表以上的关联查询 建议:说明业务逻辑在表设计上的实现不合理,需要进行表结构调整,或进行列的冗余,或进行业务改造。 2、现象:大表拆成多张小表之…...
k8s学习之路 | k8s 工作负载 DaemonSet
文章目录1. DaemonSet 基础1.1 什么是 DS1.2 DS 的典型用法1.3 如何编写 DS 资源1.4 DS 示例文件1.5 DS Pod 是如何被调度的1.6 更新 DS1.7 DS 替代方案1.8 DS 工作负载字段描述2. DaemonSet 的使用2.1 每个节点运行一个2.2 DS 更新策略2.3 滚动更新2.4 OnDelete 更新2.6 更新回…...
Javaweb MVC模式和三层架构
MVC 模式和三层架构是一些理论的知识,将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好。 7.1 MVC模式 MVC 是一种分层开发的模式,其中: M:Model,业务模型,处理业务 V:View&am…...
综合考虑,在客户端程序中嵌入网页程序,首选CefSharp。
综合考虑,在客户端程序中嵌入网页程序,首选CefSharp。 CefSharp 是一种将全功能符合标准的 Web 浏览器嵌入 C# 或 VB.NET 应用程序的简单方法。 https://www.jianshu.com/p/3f50cc747606 WinForm嵌入Web网页的解决方案 Microsoft Edge WebView2诞生较晚…...
【Java基础 下】 030 -- 网络编程
目录 一、什么是网络编程 1、常见的软件架构(CS & BS) ①、BS架构的优缺点 ②、CS架构的优缺点 2、小结 二、网络编程三要素 1、IP ①、IPv4 ②、IPv6 ③、小结 ④、IPv4的一些细节 ⑤、InetAddress的使用 2、端口号 3、协议 ①、TCP & UDP 三、…...
2021牛客OI赛前集训营-提高组(第三场) T3打拳
2021牛客OI赛前集训营-提高组(第三场) 题目大意 有2n2^n2n个选手参加拳击比赛,每个人都有一个实力,所有选手的实力用一个111到2n2^n2n的排列表示。 淘汰赛的规则是:每次相邻的两个选手进行比赛,实力值大…...
C++面向对象编程之四:成员变量和成员函数分开存储、this指针、const修饰成员和对象
在C中,成员变量和成员函数是分开存储的,只有非静态成员变量才存储在类中或类的对象上。通过该类创建的所有对象都共享同一个函数#include <iostream> using namespace std;class Monster {public://成员函数不占对象空间,所有对象共享同…...
Windows Defender彻底移除工具:2025终极完整使用教程
Windows Defender彻底移除工具:2025终极完整使用教程 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors/wi/w…...
SpringBoot+Vue Spring Boot可盈保险合同管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
系统架构设计### 摘要 随着保险行业的快速发展,传统的手工管理模式已无法满足现代保险业务的高效需求。保险合同管理系统作为保险业务的核心支撑,亟需通过信息化手段提升管理效率,降低人工操作错误率。当前市场上许多保险公司的合同管理仍依赖…...
“宏”的概念,什么是“宏”?
“宏”(Macro)本质上是一种批量处理的自动化机制,其核心概念是:将一系列频繁执行的操作、命令或代码片段预先录制或编写成一个“指令集”,通过一个简短的触发动作(如快捷键、按钮点击)来一次性调…...
构建具备上下文感知的智能对话机器人:从记忆管理到主动服务
1. 项目概述:一个能“悬浮”的智能对话机器人最近在GitHub上看到一个挺有意思的项目,叫goncharenko/hoverbot-chatbot。光看名字,hoverbot就挺抓人眼球的,直译过来是“悬浮机器人”,这不禁让人好奇,一个聊天…...
WarcraftHelper技术方案:游戏兼容性修复工具的现代化适配实践
WarcraftHelper技术方案:游戏兼容性修复工具的现代化适配实践 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 随着Windows操作系统和硬件架…...
Python开发者三步完成Taotoken大模型API的首次调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Python开发者三步完成Taotoken大模型API的首次调用 对于希望快速体验不同大模型能力的Python开发者而言,通过一个统一的…...
AI圈内两大热词 Agent 和 Skill,一文彻底搞懂它们之间的区别与联系!
本文以餐厅经理和厨师的类比,解释了 Agent 和 Skill 的核心区别:Agent 拥有决策权,决定下一步做什么;Skill 则负责执行具体任务。文章指出,尽管在实际应用中两者界限逐渐模糊,但在构建 AI 系统时࿰…...
IT68353:双DP 1.4 + HDMI 2.0 转 HDMI 2.0 单芯片KVM切换方案
一、前言多主机协同办公、电竞直播、工控监控、视频会议等场景,对4K60Hz高画质切换、键鼠共享、Type-C一线通、多路信号兼容、极简外围的需求持续攀升。传统KVM方案普遍采用多芯片拼凑架构,需要DP切换芯片、HDMI切换芯片、USB Hub、PD控制器、外置MCU等多…...
AI编程技能自学习:构建Claude与Cursor的智能协同开发环境
1. 项目概述:当Claude遇上Cursor,一场关于AI编程技能的自我进化最近在GitHub上看到一个挺有意思的项目,叫Self-Learning-Claude-Skill。虽然项目描述和正文都还是空的,但光看这个标题和关键词——claude-code、cursor、skills——…...
电源技术周览:从微生物电池到前沿功率器件深度解析
1. 电源技术周览:从微生物电池到前沿功率器件又到了每周梳理电源技术动态的时候。这周的信息密度不小,从颇具科幻感的微生物燃料电池,到未来十年锂离子电池的市场与技术路线图,再到高压直流输电和无线充电这些与我们生活、工业息息…...
