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;
        
        ...
	}

总结

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

相关文章

  • java 替换docx文件中的字符串方法实现

    java 替换docx文件中的字符串方法实现

    这篇文章主要介绍了java 替换docx文件中的字符串方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 深入理解Java并发编程之LinkedBlockingQueue队列

    深入理解Java并发编程之LinkedBlockingQueue队列

    本文主要介绍了Java并发编程之LinkedBlockingQueue队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 深入理解Java虚拟机之经典垃圾收集器

    深入理解Java虚拟机之经典垃圾收集器

    这篇文章主要介绍了深入理解Java虚拟机之经典垃圾收集器的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Spring Boot Yaml配置高级用法

    Spring Boot Yaml配置高级用法

    这篇文章主要介绍了Spring Boot Yaml配置高级用法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • java+selenium实现自动化打开页面的方法

    java+selenium实现自动化打开页面的方法

    今天小编就为大家分享一篇java+selenium实现自动化打开页面的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 详解Java注解实现自己的ORM

    详解Java注解实现自己的ORM

    这篇文章主要介绍了Java注解实现自己的ORM知识,本文通过示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-10-10
  • Java原子变量类原理及实例解析

    Java原子变量类原理及实例解析

    这篇文章主要介绍了Java原子变量类原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot配置Redis连接池的实现步骤

    SpringBoot配置Redis连接池的实现步骤

    本文主要介绍了SpringBoot配置Redis连接池的实现步骤,详细的讲解了连接池的作用、配置方式、连接池参数说明,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • Java面向对象之类的继承介绍

    Java面向对象之类的继承介绍

    大家好,本篇文章主要讲的是Java面向对象之类的继承介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Java数据类型的规则

    Java数据类型的规则

    这篇文章主要介绍了Java数据类型的规则的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12

最新评论