本文主要研究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

聊聊spring cloud gateway的XForwardedHeadersFilter相关推荐

  1. 聊聊spring cloud gateway的GlobalFilter

    序 本文主要研究一下spring cloud gateway的GlobalFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0 ...

  2. 聊聊spring cloud gateway的PreserveHostHeaderGatewayFilter

    序 本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter GatewayAutoConfiguration spring-cloud- ...

  3. 聊聊spring cloud gateway的SecureHeadersGatewayFilter

    序 本文主要研究下spring cloud gateway的SecureHeadersGatewayFilter GatewayAutoConfiguration @Configuration @Co ...

  4. 聊聊spring cloud gateway的SetStatusGatewayFilter

    序 本文主要研究下spring cloud gateway的SetStatusGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-c ...

  5. 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

    SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...

  6. 实战 Spring Cloud Gateway 之限流篇

    来源:https://www.aneasystone.com/archives/2020/08/spring-cloud-gateway-current-limiting.html 话说在 Sprin ...

  7. 从架构演进的角度聊聊Spring Cloud都做了些什么?

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  8. Spring Cloud Gateway 入门

    认识 Spring Cloud Gateway Spring Cloud Gateway 是一款基于 Spring 5,Project Reactor 以及 Spring Boot 2 构建的 API ...

  9. 网关Spring Cloud Gateway科普

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 欢迎跳转到本文的原文链接:https://honeypp ...

最新文章

  1. Pytorch - GPU ID 指定 pytorch gpu 指定
  2. 计算机cg专业,cg行业要学哪个专业好
  3. c语言字符串机考题,2016全国计算机二级《C语言》机考试题及答案
  4. Ubuntu批量修改文件名后缀
  5. UA STAT687 线性模型II 最小二乘理论3 广义最小二乘
  6. 一步一步教你写带图片注释的淡入淡出插件(三)
  7. ajax 下拉刷新 上拉加载更多,局部刷新iscroll控件的具体使用(下拉刷新,上拉加载更多)...
  8. 勒索软件赎金该不该交?
  9. SAP Spartacus 关于列表点击focus Accessibility的需求
  10. CISO的真正挑战:密码管理、IoT安全合规性
  11. Java基础---循环结构+例题
  12. 执行的输出结果保存到文件夹_元素实测点自动保存
  13. 又一例两块硬盘离线的数据恢复成功案例
  14. 日期和时间的正则表达式
  15. 常见 HTTP/FTP/WebSocket 错误代码大全 - 转
  16. 通过定制控制在屏幕上显示图片
  17. 学校机房中计算机软件安装,学校机房软件维护与安装快捷方法.doc
  18. 网络安全等级保护合规一览
  19. android原生支持机型,首发机型Find 7:OPPO发布原生Android系统
  20. 不同框架模型的对比试验

热门文章

  1. 维吉尼亚密码和一次性密码本_密码学中的一次性密码
  2. Java ObjectOutputStream writeBytes()方法与示例
  3. 现代php 阅读笔记,PHP 手册阅读笔记 - 语言参考篇
  4. 对pthread_create未定义的引用
  5. linux网络编程之通信协议格式
  6. C++ i/o类库中 常用流类
  7. 详解volatile关键字
  8. go定时器 每天重复_Go语言学习基础-定时器、计时器
  9. yfan.qiu linux硬链接与软链接
  10. select read write