Spring Cloud Gateway内置的断言和过滤器作用说明

 更新时间:2024年06月19日 10:16:04   作者:kse_music  
这篇文章主要介绍了Spring Cloud Gateway内置的断言和过滤器作用说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

对应版本3.1.7对应SpringCloud版本2021.0.7

  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
      <version>3.1.7</version>
  </dependency>

一、内置断言

1.AfterRoutePredicateFactory

作用:判断当请求时间是否在指定配置时间之后

使用方式

spring.cloud.gateway.routes[0].predicates[0]=After=2019-04-20T17:42:47.789+08:00[Asia/Shanghai]
#也可以用下面的方式配置
#spring.cloud.gateway.routes[0].predicates[0].name=After
#spring.cloud.gateway.routes[0].predicates[0].args.datetime=2019-04-20T17:42:47.789+08:00[Asia/Shanghai]

使用场景:当上线一新服务时在未来某个时间提供服务

两种配置方式的区别:

  • 第一种便捷方式配置的值是按逗号分隔,再按shortcutFieldOrder方法返回的字段顺序最后绑定的配置对象上。
  • 第二种配置方式即标准配置方式,会把整个map作为配置对象绑定源
  • 区别就是第一种最多只会绑定指定的字段尽管可能配置类字段有其它字段!

2.BeforeRoutePredicateFactory

作用:与AfterRoutePredicateFactory正好相反,判断当请求时间是否在指定配置时间之前

使用方式

spring.cloud.gateway.routes[0].predicates[0]=Before=2019-04-20T17:42:47.789+08:00[Asia/Shanghai]

使用场景:指定服务在指定时间以内访问

3.BetweenRoutePredicateFactory

作用:判断当请求时间是否在指定配置时间之间

使用方式

spring.cloud.gateway.routes[0].predicates[0].name=Between
#在datetime1后面即请求时间大于该时间
spring.cloud.gateway.routes[0].predicates[0].args.datetime1=2029-04-20T17:42:47.789+08:00[Asia/Shanghai]
#在datetime2前面即请求时间小于该时间
spring.cloud.gateway.routes[0].predicates[0].args.datetime2=2019-04-20T17:42:47.789+08:00[Asia/Shanghai]

使用场景:指定服务在指定时间范围内访问

4.CloudFoundryRouteServiceRoutePredicateFactory

作用:判断请求是否针对 Cloud Foundry 路由服务(通过判断请求头中是否有X-CF-Forwarded-Url、X-CF-Proxy-Signature、X-CF-Proxy-Metadata这个三个配置)

使用方式

spring.cloud.gateway.routes[0].predicates[0]=CloudFoundryRouteService

5.CookieRoutePredicateFactory

作用:判断请求中cookie是否包含指定字段的以及对应的值是否符合指定的模式(正则表达式)

使用方式

# cookie中id的值必须是数字
spring.cloud.gateway.routes[0].predicates[0]=Cookie=id, \\d+

6.HeaderRoutePredicateFactory

作用:判断请求头中是否包含指定字段的以及对应的值是否符合指定的模式(正则表达式)

使用方式

# header中X-Request-Id的值必须是数字
spring.cloud.gateway.routes[0].predicates[0]=Header=X-Request-Id, \\d+

7.HostRoutePredicateFactory

作用:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则

使用方式

spring.cloud.gateway.routes[0].predicates[0]=Host=api1.hiboot.cn,api2.hiboot.cn

8.MethodRoutePredicateFactory

作用:判断请求方法类型是否跟指定的类型匹配

使用方式

#指定路由只接受post和get请求
spring.cloud.gateway.routes[0].predicates[0]=Method=POST,GET

9.PathRoutePredicateFactory

作用:判断请求的URI部分是否满足路径规则。使用PathContainer解析

使用方式

spring.cloud.gateway.routes[0].predicates[0]=Path=/web/**

10.QueryRoutePredicateFactory

作用: 判断请求参数(QueryParams)是否具有给定名称且值与正则表达式匹配

使用方式

#指定请求参数age必须是数字
spring.cloud.gateway.routes[0].predicates[0]=Query=age,\\d+

11.ReadBodyRoutePredicateFactory

作用:读取请求体并缓存,后续调用谓词不需要再次反序列化

使用方式

spring.cloud.gateway.routes[0].predicates[0].name=ReadBody
spring.cloud.gateway.routes[0].predicates[0].args.inClass=java.lang.String
spring.cloud.gateway.routes[0].predicates[0].args.predicate=#{@testRequestBody}

12.RemoteAddrRoutePredicateFactory

作用:判断请求访问者的地址是否在指定指定ip/mask内

使用方式

spring.cloud.gateway.routes[0].predicates[0]=RemoteAddr=192.168.1.0/24

使用场景:配置服务只允许指定ip可访问

13.WeightRoutePredicateFactory

作用:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发

使用方式

spring.cloud.gateway.routes[0].predicates[0]=Weight=group1,1

14.XForwardedRemoteAddrRoutePredicateFactory

作用:判断是否允许根据“ X-Forward-For” HTTP标头过滤请求

使用方式

spring.cloud.gateway.routes[0].predicates[0]=XForwardedRemote=192.168.1.0/24,192.168.4.0/24

使用场景:与反向代理一起使用,例如负载平衡器或Web应用程序防火墙仅当请求来自可信赖的IP地址列表时,才允许该请求反向代理。

二、内置过滤器

1.GlobalFilter

  • RemoveCachedBodyFilter
  • AdaptCachedBodyGlobalFilter
  • NettyWriteResponseFilter
  • GatewayMetricsFilter
  • RouteToRequestUrlFilter
  • ReactiveLoadBalancerClientFilter
  • LoadBalancerServiceInstanceCookieFilter
  • WebsocketRoutingFilter
  • NettyRoutingFilter
  • ForwardRoutingFilter

2.GatewayFilter

  • AddRequestHeaderGatewayFilterFactory
  • MapRequestHeaderGatewayFilterFactory
  • AddRequestParameterGatewayFilterFactory
  • AddResponseHeaderGatewayFilterFactory
  • ModifyRequestBodyGatewayFilterFactory
  • DedupeResponseHeaderGatewayFilterFactory
  • ModifyResponseBodyGatewayFilterFactory
  • CacheRequestBodyGatewayFilterFactory
  • PrefixPathGatewayFilterFactory
  • PreserveHostHeaderGatewayFilterFactory
  • RedirectToGatewayFilterFactory
  • RemoveRequestHeaderGatewayFilterFactory
  • RemoveRequestParameterGatewayFilterFactory
  • RemoveResponseHeaderGatewayFilterFactory
  • RequestRateLimiterGatewayFilterFactory
  • RewritePathGatewayFilterFactory
  • RetryGatewayFilterFactory
  • SetPathGatewayFilterFactory
  • SecureHeadersGatewayFilterFactory
  • SetRequestHeaderGatewayFilterFactory
  • SetRequestHostHeaderGatewayFilterFactory
  • SetResponseHeaderGatewayFilterFactory
  • RewriteResponseHeaderGatewayFilterFactory
  • RewriteLocationResponseHeaderGatewayFilterFactory
  • SetStatusGatewayFilterFactory
  • SaveSessionGatewayFilterFactory
  • StripPrefixGatewayFilterFactory
  • RequestHeaderToRequestUriGatewayFilterFactory
  • RequestSizeGatewayFilterFactory
  • RequestHeaderSizeGatewayFilterFactory

三、配置参数解析模式

1.DEFAULT

配置的默认处理方式 :如果是便捷配置方式会根据接口中shortcutFieldOrder方法返回的字段顺序注入

例如:spring.cloud.gateway.routes[1].predicates[2]=Header=X-Request-Id, \\d+,则会将Header=X-Request-Id设置name,\\d+设置给regex

	default List<String> shortcutFieldOrder() {
		return Arrays.asList("header", "regexp");
	}

	public static class Config {

		@NotEmpty
		private String header;

		private String regexp;
		...

	}

2.GATHER_LIST

该解析方式的条件必须是一个字段,将配置参数解析成集合

例如:spring.cloud.gateway.routes[1].predicates[2]=Method=post,get

	default List<String> shortcutFieldOrder() {
		return Arrays.asList("methods");
	}

	public static class Config {

		private HttpMethod[] methods;

		public HttpMethod[] getMethods() {
			return methods;
		}

		public void setMethods(HttpMethod... methods) {
			this.methods = methods;
		}

	}

3.GATHER_LIST_TAIL_FLAG

该解析方式的条件必须是两个字段,前一个将配置参数解析成集合,后面一个必须要是Boolean类型数据

例如:spring.cloud.gateway.routes[1].predicates[2]=Path=/web/**, false

	default List<String> shortcutFieldOrder() {
		return Arrays.asList("patterns", "matchTrailingSlash");
	}

    public static class Config {

		private List<String> patterns = new ArrayList<>();

		private boolean matchTrailingSlash = true;
        
        ...
	}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java8接口的默认方法

    Java8接口的默认方法

    这篇文章主要为大家介绍了Java8接口的默认方法,还为大家默认方法的多重继承,感兴趣的朋友可以参考一下
    2016-01-01
  • Assert.assertNotNull()断言是否是空问题

    Assert.assertNotNull()断言是否是空问题

    这篇文章主要介绍了Assert.assertNotNull()断言是否是空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • python实现高斯模糊及原理详解

    python实现高斯模糊及原理详解

    高斯模糊是一种常见的模糊技术,本文主要介绍了python实现高斯模糊及原理详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Java面试题冲刺第二天--Redis篇

    Java面试题冲刺第二天--Redis篇

    这篇文章主要为大家分享了最有价值的三道java面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Springboot使用test无法启动问题的解决

    Springboot使用test无法启动问题的解决

    这篇文章主要介绍了Springboot使用test无法启动问题的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Mybatis-plus的selectPage()分页查询不生效问题解决

    Mybatis-plus的selectPage()分页查询不生效问题解决

    本文主要介绍了Mybatis-plus的selectPage()分页查询不生效问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java实现读取CSV文件并将数据放入对象

    Java实现读取CSV文件并将数据放入对象

    CSV文件是一种常见的数据存储格式,广泛应用于数据交换,日志记录和表格数据处理,在Java开发中,读取CSV文件并将数据映射到对象中是常见的需求,本文将详细介绍几种常见方法,有需要的可以了解下
    2025-06-06
  • ArrayList和LinkedList区别及使用场景代码解析

    ArrayList和LinkedList区别及使用场景代码解析

    这篇文章主要介绍了ArrayList和LinkedList区别及使用场景代码解析,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • SpringBoot绑定配置文件中变量的四种方式总结

    SpringBoot绑定配置文件中变量的四种方式总结

    当在Spring Boot中需要绑定配置文件中的变量时,可以使用以下注解:@PropertySourc,@Value,@Environment,@ConfigurationProperties,具体实现代码示例文中讲解的非常详细,需要的朋友可以参考下
    2023-11-11
  • java实现同态加密算法的实例代码

    java实现同态加密算法的实例代码

    这篇文章主要给大家介绍了关于java实现同态加密算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论