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

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 SetStatusGatewayFilterFactory setStatusGatewayFilterFactory() {return new SetStatusGatewayFilterFactory();}//......
}

默认创建SetStatusGatewayFilterFactory

SetStatusGatewayFilterFactory

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

public class SetStatusGatewayFilterFactory extends AbstractGatewayFilterFactory<SetStatusGatewayFilterFactory.Config> {public static final String STATUS_KEY = "status";public SetStatusGatewayFilterFactory() {super(Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList(STATUS_KEY);}@Overridepublic GatewayFilter apply(Config config) {final HttpStatus status = ServerWebExchangeUtils.parse(config.status);final Integer intStatus;if (status == null) {intStatus = Integer.parseInt(config.status);} else {intStatus = null;}return (exchange, chain) -> {// option 1 (runs in filter order)/*exchange.getResponse().beforeCommit(() -> {exchange.getResponse().setStatusCode(finalStatus);return Mono.empty();});return chain.filter(exchange);*/// option 2 (runs in reverse filter order)return chain.filter(exchange).then(Mono.fromRunnable(() -> {// check not really needed, since it is guarded in setStatusCode,// but it's a good exampleif (!exchange.getResponse().isCommitted()) {if (status != null) { // standard statussetResponseStatus(exchange, status);} else if (intStatus != null && exchange.getResponse() instanceof AbstractServerHttpResponse) { //non-standard((AbstractServerHttpResponse)exchange.getResponse()).setStatusCodeValue(intStatus);}}}));};}public static class Config {//TODO: relaxed HttpStatus converterprivate String status;public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}}}
  • 可以看到,就是简单地根据status来设置response的status
  • 注意这里有两个option,源码注释掉了option1,改为使用option2

实例

spring:cloud:gateway:routes:- id: setstatusstring_routeuri: http://example.orgpredicates:- Path=/foo/**filters:- SetStatus=BAD_REQUEST- id: setstatusint_routeuri: http://example.orgpredicates:- Path=/name/**filters:- SetStatus=401

小结

SetStatusGatewayFilter就是简单地设置response,使用option1方式的话,是在response commit之前设置的,而且一旦设置就直接return,不再继续走filter了,因而SetStatus可以生效;使用option2的话,是逆filter顺序执行的,会先判断是否commit,未commit才设置,实际不生效。

doc

  • 112.17 SetStatus GatewayFilter Factory

聊聊spring cloud gateway的SetStatusGatewayFilter相关推荐

  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的XForwardedHeadersFilter

    序 本文主要研究spring cloud gateway的XForwardedHeadersFilter 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. 更新oracle数据库表如何实现主键自增长
  2. 直接广播地址_计算机网络之网桥、冲突域、广播域是什么?
  3. Android之GSON解析JSON
  4. Node系列——Node第三方模块使用总结
  5. horizontal center and vertical middle in CSS
  6. 0-n-1中缺失的数字
  7. Ubuntu屏幕录制工具【转】
  8. 【MATLAB图像融合】[15]一个自适应PCNN的DEMO详解
  9. 二阶无源低通滤波器幅频特性曲线_几种无源滤波器的电路及频响特性对比
  10. RAC环境的AFD详解
  11. oracle同义词只有谁可以使用,oracle 同义词(synonym)
  12. RxSwift学习(五)--- RxSwift 操作符
  13. Android逆向去掉某功能,逆向教程之-反编译apk完全精简删除菜单功能(二)
  14. Typo3及Nette漏洞合集
  15. FPGA进行数字信号处理通过DAC转化为波形的初步理解
  16. matlab将多项式通分,matlab多项式因式分解
  17. 机器学习-情感分析小案例
  18. linux 看不到新加硬盘,linux中 命令df -h查不到新添加的磁盘
  19. 三角形外心坐标c语言,算法提高 12-1三角形   外心坐标
  20. 1.C标准库——stdlib.h

热门文章

  1. java设计模式适配器模式_Java解释器设计模式
  2. 使用Python Seaborn和Pandas进行数据可视化
  3. android实例教程_活动之间的Android意向处理示例教程
  4. [msi]Cannot open database file. System error -2147287035
  5. 开课吧:为什么AI工程师都要懂一点架构呢?
  6. iOS开发中的错误整理,Changing the delegate of a tab bar managed by a tab bar controller is not allowed...
  7. 第一部分 OpenStack及其构成简介
  8. 高手详解SQL性能优化十条建议
  9. 台大李宏毅Machine Learning 2017Fall学习笔记 (1)Introduction of machine Learning
  10. Flask开发服务器