聊聊spring cloud gateway的SetStatusGatewayFilter
序
本文主要研究下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相关推荐
- 聊聊spring cloud gateway的GlobalFilter
序 本文主要研究一下spring cloud gateway的GlobalFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0 ...
- 聊聊spring cloud gateway的PreserveHostHeaderGatewayFilter
序 本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter GatewayAutoConfiguration spring-cloud- ...
- 聊聊spring cloud gateway的SecureHeadersGatewayFilter
序 本文主要研究下spring cloud gateway的SecureHeadersGatewayFilter GatewayAutoConfiguration @Configuration @Co ...
- 聊聊spring cloud gateway的XForwardedHeadersFilter
序 本文主要研究spring cloud gateway的XForwardedHeadersFilter GatewayAutoConfiguration spring-cloud-gateway-c ...
- 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探
SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...
- 实战 Spring Cloud Gateway 之限流篇
来源:https://www.aneasystone.com/archives/2020/08/spring-cloud-gateway-current-limiting.html 话说在 Sprin ...
- 从架构演进的角度聊聊Spring Cloud都做了些什么?
Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...
- Spring Cloud Gateway 入门
认识 Spring Cloud Gateway Spring Cloud Gateway 是一款基于 Spring 5,Project Reactor 以及 Spring Boot 2 构建的 API ...
- 网关Spring Cloud Gateway科普
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 欢迎跳转到本文的原文链接:https://honeypp ...
最新文章
- 更新oracle数据库表如何实现主键自增长
- 直接广播地址_计算机网络之网桥、冲突域、广播域是什么?
- Android之GSON解析JSON
- Node系列——Node第三方模块使用总结
- horizontal center and vertical middle in CSS
- 0-n-1中缺失的数字
- Ubuntu屏幕录制工具【转】
- 【MATLAB图像融合】[15]一个自适应PCNN的DEMO详解
- 二阶无源低通滤波器幅频特性曲线_几种无源滤波器的电路及频响特性对比
- RAC环境的AFD详解
- oracle同义词只有谁可以使用,oracle 同义词(synonym)
- RxSwift学习(五)--- RxSwift 操作符
- Android逆向去掉某功能,逆向教程之-反编译apk完全精简删除菜单功能(二)
- Typo3及Nette漏洞合集
- FPGA进行数字信号处理通过DAC转化为波形的初步理解
- matlab将多项式通分,matlab多项式因式分解
- 机器学习-情感分析小案例
- linux 看不到新加硬盘,linux中 命令df -h查不到新添加的磁盘
- 三角形外心坐标c语言,算法提高 12-1三角形 外心坐标
- 1.C标准库——stdlib.h
热门文章
- java设计模式适配器模式_Java解释器设计模式
- 使用Python Seaborn和Pandas进行数据可视化
- android实例教程_活动之间的Android意向处理示例教程
- [msi]Cannot open database file. System error -2147287035
- 开课吧:为什么AI工程师都要懂一点架构呢?
- iOS开发中的错误整理,Changing the delegate of a tab bar managed by a tab bar controller is not allowed...
- 第一部分 OpenStack及其构成简介
- 高手详解SQL性能优化十条建议
- 台大李宏毅Machine Learning 2017Fall学习笔记 (1)Introduction of machine Learning
- Flask开发服务器