聊聊spring cloud gateway的XForwardedHeadersFilter

本文主要研究spring cloud gateway的XForwardedHeadersFilter

GatewayAutoConfiguration

spring-cloud-gateway-core-2.0.0.RC1-sources.jar!/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java

@Configuration
@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true)
@EnableConfigurationProperties
@AutoConfigureBefore(HttpHandlerAutoConfiguration.class)
@AutoConfigureAfter({GatewayLoadBalancerClientAutoConfiguration.class, GatewayClassPathWarningAutoConfiguration.class})
@ConditionalOnClass(DispatcherHandler.class)
public class GatewayAutoConfiguration {//......@Bean@ConditionalOnProperty(name = "spring.cloud.gateway.x-forwarded.enabled", matchIfMissing = true)public XForwardedHeadersFilter xForwardedHeadersFilter() {return new XForwardedHeadersFilter();}//......
}
默认注册了XForwardedHeadersFilter

XForwardedHeadersFilter

spring-cloud-gateway-core-2.0.0.RC1-sources.jar!/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java

@ConfigurationProperties("spring.cloud.gateway.x-forwarded")
public class XForwardedHeadersFilter implements HttpHeadersFilter, Ordered {//......@Overridepublic HttpHeaders filter(HttpHeaders input, ServerWebExchange exchange) {ServerHttpRequest request = exchange.getRequest();HttpHeaders original = input;HttpHeaders updated = new HttpHeaders();original.entrySet().stream().forEach(entry -> updated.addAll(entry.getKey(), entry.getValue()));if (isForEnabled()) {String remoteAddr = request.getRemoteAddress().getAddress().getHostAddress();List<String> xforwarded = original.get(X_FORWARDED_FOR_HEADER);// prevent duplicatesif (remoteAddr != null &&(xforwarded == null || !xforwarded.contains(remoteAddr))) {write(updated, X_FORWARDED_FOR_HEADER, remoteAddr, isForAppend());}}String proto = request.getURI().getScheme();if (isProtoEnabled()) {write(updated, X_FORWARDED_PROTO_HEADER, proto, isProtoAppend());}if (isPortEnabled()) {String port = String.valueOf(request.getURI().getPort());if (request.getURI().getPort() < 0) {port = String.valueOf(getDefaultPort(proto));}write(updated, X_FORWARDED_PORT_HEADER, port, isPortAppend());}if (isHostEnabled()) {String host = toHostHeader(request);write(updated, X_FORWARDED_HOST_HEADER, host, isHostAppend());}return updated;}//......
}
  • 如果spring.cloud.gateway.x-forwarded.for-enabled为true,则会写入X-Forwarded-For
  • 如果spring.cloud.gateway.x-forwarded.proto-enabled为true,则会写入X-Forwarded-Proto
  • 如果spring.cloud.gateway.x-forwarded.port-enabled为true,则会写入X-Forwarded-Port
  • 如果spring.cloud.gateway.x-forwarded.host-enabled为true,则会写入X-Forwarded-Host

每个enable属性都有一个append属性,用来决定是否是添加还是追加

    private void write(HttpHeaders headers, String name, String value, boolean append) {if (append) {headers.add(name, value);// these headers should be treated as a single comma separated headerList<String> values = headers.get(name);String delimitedValue = StringUtils.collectionToCommaDelimitedString(values);headers.set(name, delimitedValue);} else {headers.set(name, value);}}
如果是append,则逗号分隔写入headers,如果不是则是采取set操作。

配置

    {"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.enabled","description": "If the XForwardedHeadersFilter is enabled.","type": "java.lang.Boolean"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.for-append","description": "If appending X-Forwarded-For as a list is enabled.","type": "java.lang.Boolean"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.for-enabled","description": "If X-Forwarded-For is enabled.","type": "java.lang.Boolean"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.host-append","description": "If appending X-Forwarded-Host as a list is enabled.","type": "java.lang.Boolean"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.host-enabled","description": "If X-Forwarded-Host is enabled.","type": "java.lang.Boolean"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": 0,"name": "spring.cloud.gateway.x-forwarded.order","description": "The order of the XForwardedHeadersFilter.","type": "java.lang.Integer"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.port-append","description": "If appending X-Forwarded-Port as a list is enabled.","type": "java.lang.Boolean"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.port-enabled","description": "If X-Forwarded-Port is enabled.","type": "java.lang.Boolean"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.proto-append","description": "If appending X-Forwarded-Proto as a list is enabled.","type": "java.lang.Boolean"},{"sourceType": "org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter","defaultValue": true,"name": "spring.cloud.gateway.x-forwarded.proto-enabled","description": "If X-Forwarded-Proto is enabled.","type": "java.lang.Boolean"}

小结

spring cloud gateway提供了XForwardedHeadersFilter,用来决定进行路由转发的时候转发哪些X-Forwarded相关的header,同时提供append选项,用来控制是否是追加还是覆盖到header中。

doc

  • _modifying_the_way_remote_addresses_are_resolved

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专访赵加雨:WebRTC在网易云信的落地

去年的这个时候&#xff0c;在市面上公开表示使用WebRTC的公司还没几家&#xff0c;但2018年以来&#xff0c;宣布采用或支持WebRTC的公司已经越来越多。实时音视频提供商网易云信也在自研的NRTC中集成了WebRTC。在他们眼里&#xff0c;2017年是WebRTC的转折之年&#xff0c;而…

1、Linux命令随笔

1 Linux命令总结2 3 man 命令帮助;4 help 命令的帮助&#xff08;bash的内置命令&#xff09;;5 ls list,查看目录列表;6 -ld&#xff1a;查看目录权限;7 -l:(long)长格式显示属性;8 -F:给不同的文件类型结尾加标识9 -p:给目录加斜线10 …

1137. 第 N 个泰波那契数

泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;4 解释&#xff1a; T_3 0 1 1 2 T_4 1…

5827. 检查操作是否合法

给你一个下标从 0 开始的 8 x 8 网格 board &#xff0c;其中 board[r][c] 表示游戏棋盘上的格子 (r, c) 。棋盘上空格用 ‘.’ 表示&#xff0c;白色格子用 ‘W’ 表示&#xff0c;黑色格子用 ‘B’ 表示。 游戏中每次操作步骤为&#xff1a;选择一个空格子&#xff0c;将它变…

5193. 删除字符使字符串变好

5193. 删除字符使字符串变好 一个字符串如果没有 三个连续 相同字符&#xff0c;那么它就是一个 好字符串 。 给你一个字符串 s &#xff0c;请你从 s 删除 最少 的字符&#xff0c;使它变成一个 好字符串 。 请你返回删除后的字符串。题目数据保证答案总是 唯一的 。 示例 …

PHP--------微信网页开发实现微信扫码功能

今天说说微商城项目中用到的扫一扫这个功能&#xff0c;分享一下&#xff0c;希望对各位有所帮助。 前提&#xff1a;要有公众号&#xff0c;和通过微信认证&#xff0c;绑定域名&#xff0c;得到相应信息&#xff0c;appid&#xff0c;appsecret等。 微信开发文档&#xff1a;…

313. 超级丑数

超级丑数 是一个正整数&#xff0c;并满足其所有质因数都出现在质数数组 primes 中。 给你一个整数 n 和一个整数数组 primes &#xff0c;返回第 n 个 超级丑数 。 题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。 示例 1&#xff1a; 输入&#xff1a;n 12,…

[SQL] 请教一下 count里面有case when 一般情况下啥时候用

http://www.itpub.net/forum.php?modviewthread&tid1810967 问题: 比如 count(case when pday_id${deal_date} then 1 end) 我有点想不明白具体什么情况下count&#xff08;&#xff09; 这个小括号里面还要用case when 大家做BI统计的时候一般什么情况用啊 还有个…

路由器架设虚拟服务器让外网访问到本地网站

确定电脑与路由器正确连接&#xff0c;并且已连至互联网。在地址栏中输入192.168.0.1回车&#xff0c;输入用户名密码&#xff0c;进入路由器主界面。 然后点击左侧菜单中的“虚拟服务器”&#xff0c;——“端口段映射”打开“端口段映射”界面。 由于网站用的是80端口&#x…

selenium模块

selenium模块 阅读目录 一 介绍二 安装三 基本使用四 选择器五 等待元素被加载六 元素交互操作七 其他八 项目练习一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器&#xff0c;完…

关于tomcat Post 数据参数的问题

2019独角兽企业重金招聘Python工程师标准>>> POST请求本身并未限制传入参数大小&#xff0c;是tomcat 容器设置了接收参数大小的限制。修改server.xml <Connector port"8080" protocol"HTTP/1.1" connectionTimeout"2000" red…

杜教筛--51nod1239 欧拉函数之和

求$\sum_{i1}^{n}\varphi (i)$&#xff0c;$n\leqslant 1e10$。 这里先把杜教筛的一般套路贴一下&#xff1a; 要求$S(n)\sum_{i1}^{n}f(i)$&#xff0c;而现在有一数论函数$g(i)$&#xff0c;$g(i)$的前缀和很无脑&#xff0c;且$f$和$g$的狄利克雷卷积的前缀和很无脑&#xf…

修改npm全局安装模式的路径

修改npm全局安装模式的路径 在正式写此文章之前&#xff0c;我得说一点血泪史。 刚学nodeJS不久&#xff0c;很纳闷为什么全局安装的模块在 node安装目录/node_modules‘ 中没找到&#xff01;后来仔细看了下安装成功后的信息&#xff0c;才发现原来是自动安装在C盘了&#xff…

在Mac上为自己手动编译安装一套PHP7的开发环境

首先你得去官网下载php7 beta1的版本 这里由于我是在mac上安装&#xff0c;所以就去下载linux相关的版本&#xff0c;地址也直接附上了php7 beta1windows版的官方也有发布详情猛戳&#xff1a;这里 解压安装包&#xff0c;进入源代码目录 tar -zxvf php-7.0.0beta1.tar.gz cd p…

卡特兰数 HDU2067 HDU4165 HDU1134

题目链接&#xff1a;https://vjudge.net/problem/HDU-2067 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11800 Accepted Submission(s): 5952 Problem Description小兔的叔叔从外面旅游回来给她…

Publish/Subscribe

Publish/Subscribe 我们将会投递一个消息给多个消费者&#xff0c;这种模式被称为“publish/subscribe” 通俗的讲&#xff0c;前面的是点对点队列模型&#xff0c;现在讲的是发布订阅模型。 Exchanges producer&#xff1a;一个发送消息的用户应用程序 queue&#xff1a;一个存…

[转]在ROS下使用zeroconf配置多机通信

原文地址&#xff1a;http://www.corvin.cn/635.html&#xff0c;转载主要方便随时查阅&#xff0c;如有版权要求&#xff0c;请及时联系。 0x00 为何需要配置ROS多机通信 众所周知ROS是分布式系统&#xff0c;因此可以将机器人需要处理的复杂、计算量大的任务分解在多台机器上…

NGINX原理 之 SLAB分配机制(转)

1 引言 众所周知&#xff0c;操作系统使用伙伴系统管理内存&#xff0c;不仅会造成大量的内存碎片&#xff0c;同时处理效率也较低下。SLAB是一种内存管理机制&#xff0c;其拥有较高的处理效率&#xff0c;同时也有效的避免内存碎片的产生&#xff0c;其核心思想是预分配。其按…

dynamic web module消失不见

2019独角兽企业重金招聘Python工程师标准>>> 方法1&#xff1a;在project Facets选项中勾选Dynamic Web Module即可 方法2&#xff1a; 我用eclipse对项目进行修改名称&#xff0c;修改成功后。项目就没有Deployment Descriptor&#xff08;如下图红色框中&#xff…

576. 出界的路径数

576. 出界的路径数 给你一个大小为 m x n 的网格和一个球。球的起始坐标为 [startRow, startColumn] 。你可以将球移到在四个方向上相邻的单元格内&#xff08;可以穿过网格边界到达网格之外&#xff09;。你 最多 可以移动 maxMove 次球。 给你五个整数 m、n、maxMove、star…