架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3294|回复: 0

[资料] Spring Cloud Gateway 内置的过滤器工厂

[复制链接]
发表于 2022-2-7 13:36:49 | 显示全部楼层 |阅读模式
内置的过滤器工厂

这里简单将Spring Cloud Gateway内置的所有过滤器工厂整理成了一张表格,虽然不是很详细,但能作为速览使用。如下:

过滤器工厂
作用
参数
AddRequestHeader
为原始请求添加Header
Header的名称及值
AddRequestParameter
为原始请求添加请求参数
参数名称及值
AddResponseHeader
为原始响应添加Header
Header的名称及值
DedupeResponseHeader
剔除响应头中重复的值
需要去重的Header名称及去重策略
Hystrix
为路由引入Hystrix的断路器保护
HystrixCommand的名称
FallbackHeaders
为fallbackUri的请求头中添加具体的异常信息
Header的名称
PrefixPath
为原始请求路径添加前缀
前缀路径
PreserveHostHeader
为请求添加一个preserveHostHeader=true的属性,路由过滤器会检查该属性以决定是否要发送原始的Host
RequestRateLimiter
用于对请求限流,限流算法为令牌桶
keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus
RedirectTo
将原始请求重定向到指定的URL
http状态码及重定向的url
RemoveHopByHopHeadersFilter
为原始请求删除IETF组织规定的一系列Header
默认就会启用,可以通过配置指定仅删除哪些Header
RemoveRequestHeader
为原始请求删除某个Header
Header名称
RemoveResponseHeader
为原始响应删除某个Header
Header名称
RewritePath
重写原始的请求路径
原始路径正则表达式以及重写后路径的正则表达式
RewriteResponseHeader
重写原始响应中的某个Header
Header名称,值的正则表达式,重写后的值
SaveSession
在转发请求之前,强制执行WebSession::save操作
secureHeaders
为原始响应添加一系列起安全作用的响应头
无,支持修改这些安全响应头的值
SetPath
修改原始的请求路径
修改后的路径
SetResponseHeader
修改原始响应中某个Header的值
Header名称,修改后的值
SetStatus
修改原始响应的状态码
HTTP 状态码,可以是数字,也可以是字符串
StripPrefix
用于截断原始请求的路径
使用数字表示要截断的路径的数量
Retry
针对不同的响应进行重试
retries、statuses、methods、series
RequestSize
设置允许接收最大请求包的大小。如果请求包大小超过设置的值,则返回 413 Payload Too Large
请求包大小,单位为字节,默认值为5M
ModifyRequestBody
在转发请求之前修改原始请求体内容
修改后的请求体内容
ModifyResponseBody
修改原始响应体的内容
修改后的响应体内容
Default
为所有路由添加过滤器
过滤器工厂名称及值

Tips:每个过滤器工厂都对应一个实现类,并且这些类的名称必须以GatewayFilterFactory结尾,这是Spring Cloud Gateway的一个约定,例如AddRequestHeader对应的实现类为AddRequestHeaderGatewayFilterFactory。对源码感兴趣的小伙伴就可以按照这个规律拼接出具体的类名,以此查找这些内置过滤器工厂的实现代码。

1、AddRequestHeader GatewayFilter Factory

为原始请求添加Header,配置示例:


为原始请求添加名为 X-Request-Foo ,值为 Bar 的请求头

2、AddRequestParameter GatewayFilter Factory

为原始请求添加请求参数及值,配置示例:


为原始请求添加名为foo,值为bar的参数,即:foo=bar

3、AddResponseHeader GatewayFilter Factory

为原始响应添加Header,配置示例:


为原始响应添加名为 X-Request-Foo ,值为 Bar 的响应头

4、DedupeResponseHeader GatewayFilter Factory

DedupeResponseHeader可以根据配置的Header名称及去重策略剔除响应头中重复的值,这是Spring Cloud Greenwich SR2提供的新特性,低于这个版本无法使用。

我们在Gateway以及微服务上都设置了CORS(解决跨域)Header的话,如果不做任何配置,那么请求 -> 网关 -> 微服务,获得的CORS Header的值,就将会是这样的:


Access-Control-Allow-Credentials: true, true
Access-Control-Allow-Origin: https://musk.mars, https://musk.mars
可以看到这两个Header的值都重复了,若想把这两个Header的值去重的话,就需要使用到DedupeResponseHeader,配置示例:

去重策略:

  • RETAIN_FIRST:默认值,保留第一个值
  • RETAIN_LAST:保留最后一个值
  • RETAIN_UNIQUE:保留所有唯一值,以它们第一次出现的顺序保留


若想对该过滤器工厂有个比较全面的了解的话,建议阅读该过滤器工厂的源码,因为源码里有详细的注释及示例,比官方文档写得还好:org.springframework.cloud.gateway.filter.factory.DedupeResponseHeaderGatewayFilterFactory

5、Hystrix GatewayFilter Factory

为路由引入Hystrix的断路器保护,配置示例:


Hystrix是Spring Cloud第一代容错组件,不过已经进入维护模式,未来Hystrix会被Spring Cloud移除掉,取而代之的是Alibaba Sentinel/Resilience4J。所以本文不做详细介绍了,感兴趣的话可以参考官方文档:Hystrix GatewayFilter Factory

6、FallbackHeaders GatewayFilter Factory

同样是对Hystrix的支持,上一小节所介绍的过滤器工厂支持一个配置参数:fallbackUri,该配置用于当发生异常时将请求转发到一个特定的uri上。而FallbackHeaders这个过滤工厂可以在转发请求到该uri时添加一个Header,这个Header的值为具体的异常信息。配置示例:


这里也不做详细介绍了,感兴趣可以参考官方文档:FallbackHeaders GatewayFilter Factory

7、PrefixPath GatewayFilter Factory

为原始的请求路径添加一个前缀路径,配置示例:


该配置使访问${GATEWAY_URL}/hello 会转发到 https://example.org/mypath/hello

8、PreserveHostHeader GatewayFilter Factory

为请求添加一个preserveHostHeader=true的属性,路由过滤器会检查该属性以决定是否要发送原始的Host Header。配置示例:


如果不设置,那么名为 Host 的Header将由Http Client控制

9、RequestRateLimiter GatewayFilter Factory

用于对请求进行限流,限流算法为令牌桶。配置示例:


10、RedirectTo GatewayFilter Factory

将原始请求重定向到指定的Url,配置示例:


该配置使访问 ${GATEWAY_URL}/hello 会被重定向到 https://acme.org/hello ,并且携带一个 Location:http://acme.org 的Header,而返回客户端的HTTP状态码为302

注意事项:

HTTP状态码应为3xx,例如301

URL必须是合法的URL,该URL会作为Location Header的值

11、RemoveHopByHopHeadersFilter GatewayFilter Factory

为原始请求删除IETF组织规定的一系列Header,默认删除的Header如下:


  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade


可以通过配置去指定仅删除哪些Header,配置示例:


12、RemoveRequestHeader GatewayFilter Factory

为原始请求删除某个Header,配置示例:


删除原始请求中名为 X-Request-Foo 的请求头

13、RemoveResponseHeader GatewayFilter Factory

为原始响应删除某个Header,配置示例:


删除原始响应中名为 X-Request-Foo 的响应头

14、RewritePath GatewayFilter Factory

通过正则表达式重写原始的请求路径,配置示例:


该配置使得访问 /foo/bar 时,会将路径重写为/bar 再进行转发,也就是会转发到 https://example.org/bar。需要注意的是:由于YAML语法,需用$\ 替换 $

15、RewriteResponseHeader GatewayFilter Factory

重写原始响应中的某个Header,配置示例:


该配置的意义在于:如果响应头中 X-Response-Foo 的值为/42?user=ford&password=omg!what&flag=true,那么就会被按照配置的值重写成/42?user=ford&password=***&flag=true,也就是把其中的password=omg!what重写成了password=***

16、SaveSession GatewayFilter Factory

在转发请求之前,强制执行WebSession::save操作,配置示例:


主要用在那种像 Spring Session 延迟数据存储(数据不是立刻持久化)的,并希望在请求转发前确保session状态保存情况。如果你将Spring Secutiry于Spring Session集成使用,并想确保安全信息都传到下游机器,你就需要配置这个filter。

17、secureHeaders GatewayFilter Factory

secureHeaders过滤器工厂主要是参考了这篇博客中的建议,为原始响应添加了一系列起安全作用的响应头。默认会添加如下Headers(包括值):


  • X-Xss-Protection:1; mode=block
  • Strict-Transport-Security:max-age=631138519
  • X-Frame-Options:DENY
  • X-Content-Type-Options:nosniff
  • Referrer-Policy:no-referrer
  • Content-Security-Policy:default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
  • X-Download-Options:noopen
  • X-Permitted-Cross-Domain-Policies:none


如果你想修改这些Header的值,那么就需要使用这些Headers对应的后缀,如下:

  • xss-protection-header
  • strict-transport-security
  • frame-options
  • content-type-options
  • referrer-policy
  • content-security-policy
  • download-options
  • permitted-cross-domain-policies


配置示例:


如果想禁用某些Header,可使用如下配置:

18、SetPath GatewayFilter Factory

修改原始的请求路径,配置示例:


该配置使访问 ${GATEWAY_URL}/foo/bar 时会转发到 https://example.org/bar ,也就是原本的/foo/bar被修改为了/bar

19、SetResponseHeader GatewayFilter Factory

修改原始响应中某个Header的值,配置示例:


将原始响应中 X-Response-Foo 的值修改为 Bar

20、SetStatus GatewayFilter Factory

修改原始响应的状态码,配置示例:


SetStatusd的值可以是数字,也可以是字符串。但一定要是Spring HttpStatus 枚举类中的值。上面这两种配置都可以返回401这个HTTP状态码。

21、StripPrefix GatewayFilter Factory

用于截断原始请求的路径,配置示例:


如上配置,如果请求的路径为 /name/bar/foo ,那么则会截断成/foo后进行转发 ,也就是会截断2个路径。

22、Retry GatewayFilter Factory

针对不同的响应进行重试,例如可以针对HTTP状态码进行重试,配置示例:


可配置如下参数:

  • retries:重试次数
  • statuses:需要重试的状态码,取值在 org.springframework.http.HttpStatus 中
  • methods:需要重试的请求方法,取值在 org.springframework.http.HttpMethod 中
  • series:HTTP状态码序列,取值在 org.springframework.http.HttpStatus.Series 中


23、RequestSize GatewayFilter Factory

设置允许接收最大请求包的大小,配置示例:


如果请求包大小超过设置的值,则会返回 413 Payload Too Large以及一个errorMessage

24、Modify Request Body GatewayFilter Factory

在转发请求之前修改原始请求体内容,该过滤器工厂只能通过代码配置,不支持在配置文件中配置。代码示例:


Tips:该过滤器工厂处于 BETA 状态,未来API可能会变化,生产环境请慎用

25、Modify Response Body GatewayFilter Factory

可用于修改原始响应体的内容,该过滤器工厂同样只能通过代码配置,不支持在配置文件中配置。代码示例:


Tips:该过滤器工厂处于 BETA 状态,未来API可能会变化,生产环境请慎用

26、Default Filters

Default Filters用于为所有路由添加过滤器工厂,也就是说通过Default Filter所配置的过滤器工厂会作用到所有的路由上。配置示例:


(完)




上一篇:【实战】Docker 日志占满磁盘和数据迁移
下一篇:Java 动态拼接 SQL 语句防止数据库注入
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-19 19:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表