本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter

GatewayAutoConfiguration

spring-cloud-gateway-core-2.0.0.RC2-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 {//......@Beanpublic PreserveHostHeaderGatewayFilterFactory preserveHostHeaderGatewayFilterFactory() {return new PreserveHostHeaderGatewayFilterFactory();}//......
}
复制代码

PreserveHostHeaderGatewayFilterFactory

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

public class PreserveHostHeaderGatewayFilterFactory extends AbstractGatewayFilterFactory {public GatewayFilter apply() {return apply(o -> {});}public GatewayFilter apply(Object config) {return (exchange, chain) -> {exchange.getAttributes().put(PRESERVE_HOST_HEADER_ATTRIBUTE, true);return chain.filter(exchange);};}
}
复制代码

这个filter超级简单,就往exchange添加PRESERVE_HOST_HEADER_ATTRIBUTE,设置为true

NettyRoutingFilter

spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java

public class NettyRoutingFilter implements GlobalFilter, Ordered {private final HttpClient httpClient;private final ObjectProvider<List<HttpHeadersFilter>> headersFilters;public NettyRoutingFilter(HttpClient httpClient,ObjectProvider<List<HttpHeadersFilter>> headersFilters) {this.httpClient = httpClient;this.headersFilters = headersFilters;}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);String scheme = requestUrl.getScheme();if (isAlreadyRouted(exchange) || (!"http".equals(scheme) && !"https".equals(scheme))) {return chain.filter(exchange);}setAlreadyRouted(exchange);ServerHttpRequest request = exchange.getRequest();final HttpMethod method = HttpMethod.valueOf(request.getMethod().toString());final String url = requestUrl.toString();HttpHeaders filtered = filterRequest(this.headersFilters.getIfAvailable(),exchange);final DefaultHttpHeaders httpHeaders = new DefaultHttpHeaders();filtered.forEach(httpHeaders::set);String transferEncoding = request.getHeaders().getFirst(HttpHeaders.TRANSFER_ENCODING);boolean chunkedTransfer = "chunked".equalsIgnoreCase(transferEncoding);boolean preserveHost = exchange.getAttributeOrDefault(PRESERVE_HOST_HEADER_ATTRIBUTE, false);return this.httpClient.request(method, url, req -> {final HttpClientRequest proxyRequest = req.options(NettyPipeline.SendOptions::flushOnEach).headers(httpHeaders).chunkedTransfer(chunkedTransfer).failOnServerError(false).failOnClientError(false);if (preserveHost) {String host = request.getHeaders().getFirst(HttpHeaders.HOST);proxyRequest.header(HttpHeaders.HOST, host);}return proxyRequest.sendHeaders() //I shouldn't need this.send(request.getBody().map(dataBuffer ->((NettyDataBuffer)dataBuffer).getNativeBuffer()));}).doOnNext(res -> {ServerHttpResponse response = exchange.getResponse();// put headers and status so filters can modify the responseHttpHeaders headers = new HttpHeaders();res.responseHeaders().forEach(entry -> headers.add(entry.getKey(), entry.getValue()));HttpHeaders filteredResponseHeaders = HttpHeadersFilter.filter(this.headersFilters.getIfAvailable(), headers, exchange, Type.RESPONSE);response.getHeaders().putAll(filteredResponseHeaders);HttpStatus status = HttpStatus.resolve(res.status().code());if (status != null) {response.setStatusCode(status);} else if (response instanceof AbstractServerHttpResponse) {// https://jira.spring.io/browse/SPR-16748((AbstractServerHttpResponse) response).setStatusCodeValue(res.status().code());} else {throw new IllegalStateException("Unable to set status code on response: " +res.status().code()+", "+response.getClass());}// Defer committing the response until all route filters have run// Put client response as ServerWebExchange attribute and write response later NettyWriteResponseFilterexchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res);}).then(chain.filter(exchange));}
}
复制代码

这里从读取PRESERVE_HOST_HEADER_ATTRIBUTE属性,没有则默认false。如果为true,则proxyRequest.header(HttpHeaders.HOST, host),传递host头部。

小结

PreserveHostHeaderGatewayFilter就是在gateway转发请求的时候把原始请求的host头部带上,转发给目标服务。默认该filter是启用的。

doc

  • 112.6 PreserveHostHeader GatewayFilter Factory

聊聊spring cloud gateway的PreserveHostHeaderGatewayFilter相关推荐

  1. 聊聊spring cloud gateway的GlobalFilter

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

  2. 聊聊spring cloud gateway的SecureHeadersGatewayFilter

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

  3. 聊聊spring cloud gateway的XForwardedHeadersFilter

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

  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. 支持向量机算法原理简介
  2. thinkphp5的目录结构和命名规范
  3. 尽管苹果打死不认 但iCloud被破解是真的:媒体亲身验证
  4. 单核工作法13:永不拖延(上)
  5. Qt之QStackedWidget
  6. TOML-To-Go 更新,支持暗黑模式
  7. 李宏毅机器学习课程-Transfer Learning
  8. java 字段构造函数_依赖注入–字段vs构造函数vs方法
  9. [Kaggle] Digit Recognizer 手写数字识别(神经网络)
  10. 《深入理解 Spring Cloud 与微服务构建》第六章 服务注册和发现 Eureka
  11. Jumper蹦跶的人:一段天马行空的梦想
  12. 并行计算、分布式计算、网格计算讲解
  13. ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理周边属性
  14. 揭开关于激光雷达传感器的常见误区——第二部分
  15. win7如何启动蓝牙的设备添加到计算机
  16. WIN7电脑如何共享WiFi
  17. ZPO006采购单收货报表
  18. MAC OS 上好用的文本编辑器除了Sublime Text和BBEdit还有这些好用的推荐一下。
  19. java项目统一打印入参出参等日志
  20. 【AUTOSAR CanDrive 2.了解通信Hoh、CanId与PduID的Mapping关系】

热门文章

  1. Docker 清理命令集锦
  2. 人脸检测流程及正负样本下载
  3. 触控(Touch) 、 布局(Layout)
  4. 采集音频和摄像头视频并实时H264编码及AAC编码
  5. 大型网站采用什么系统架构保证性能稳定性
  6. 【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)
  7. C# 2.0 的partial
  8. 调用系统中的默认EMAIL程序
  9. 线性回归介绍及分别使用最小二乘法和梯度下降法对线性回归C++实现
  10. linux驱动:音频驱动(二)ASoc