Spring Cloud Gateway内置GatewayFilter工厂类(三)

5.13 RewritePath GatewayFilter Factory

  这个过滤器的实现类是:RewritePathGatewayFilterFactory,它需要两个参数,一个是请求路径的正则表达式,一个是替换的路径参数。使用Java的正则表达式重写请求路径可以更加灵活。在路由请求转发给后面的服务的时候,可以根据需要重写请求路径,在application.yml中的配置如下所示:


spring:
  cloud:
    gateway:
      routes:
      - id: rewritepath_route
        uri: http://localhost:8080
        predicates:
        - Path=/foo/**
        filters:
        - RewritePath=/foo/(?<segment>.*), /$\{segment}

在浏览器中输入http://localhost:8080/foo/bar,在经过此过滤器处理之后,将会使用bar代替/foo/bar,使请求路径变成http://localhost:8080/bar。这里需要注意的是,由于YAML规则的限制,使用$\代替$。

在源码中的项目中,在路由id为app-a-route的例子中已经使用了这个过滤器。在将请求转发给后面的服务的时候,会重写请求路径。

5.14 RewriteResponseHeader GatewayFilter Factory

  这个过滤器的实现类是:RewriteResponseHeaderGatewayFilterFactory,它用来重写响应的包头信息,它需要三个参数,一个是重写的包头中的字段名,一个正则表达式,一个是替换参数。这里使用Java的正则表达来可以更灵活的重写响应中的包头数据。在application.yml中的配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: rewriteresponseheader_route
        uri: http://example.org
        filters:
        - RewriteResponseHeader=X-Response-Foo, , password=[^&]+, password=***

假如一个响应的包头中X-Response-Foo的值为/42?user=ford&password=omg!what&flag=true,此过滤器将会把X-Response-Foo的值变成:/42?user=ford&password=***&flag=true,也就是把password=omg!what替换成了passowrd=***。这样可以保护密码的安全。在写正则表达式的时候,由于YAML的语法的限制,需要使用$\代替换$

5.15 SaveSession GatewayFilter Factory

  这个过滤器的实现类是:SaveSessionGatewayFilterFactory,在请求向下面的执链发送之前,会强制调用WebSession:save操作,这是一个特殊的使用,比如当集成Spring Session框架时,会延迟存储数据,需要保证session的状态已经被保存。Spring Session会将session信息存储到Redis中,以实现共享session功能。配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: save_session
        uri: http://example.org
        predicates:
        - Path=/foo/**
        filters:
        - SaveSession

如要项目集成了Spring Session中的Spring Security框架,希望安全验证信息可以转发到远程应用,那么这个配置是必须的。

5.16 SecureHeaders GatewayFilter Factory

  这个过滤器工厂的实现类是:SecureHeadersGatewayFilterFactory,它的作用是给响应的包头中添加一些安全保护的字段信息,可以查看这个博客:https://blog.appcanary.com/2017/http-security-headers.html,它说明了为什么要添加这些字段的原因。下面这些包头字段是被默认添加的:

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

可以在配置文件中通过下面这个配置修改上述包头字段的默认值:

spring.cloud.gateway.filter.secure-headers

修改的属性有:

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

5.17 SetPath GatewayFilter Factory

  这个过滤器工厂的实现类是:SetPathGatewayFilterFactory,它需要一个模板参数,它提供了一个简单的根据模板参数操作请求路径的方式,使用了Spring Framework的uri templates,也支持匹配多个segments。如下面配置所示:

spring:
  cloud:
    gateway:
      routes:
      - id: setpath_route
        uri: http://example.org
        predicates:
        - Path=/foo/{segment}
        filters:
        - SetPath=/{segment}

这个配置对于URI为foo/bar的请求,将会在向请求链发送之前变成/bar

5.18 SetResponseHeader GatewayFilter Factory

  这个过滤器的实现类是:SetResponseHeaderGatewayFilterFactory,它需要两个参数,一个name,一个value。如下面的配置所示:

spring:
  cloud:
    gateway:
      routes:
      - id: setresponseheader_route
        uri: http://example.org
        filters:
        - SetResponseHeader=X-Response-Foo, Bar

这个过滤器会替换响应包头中所有给定参数为name的字段值为value,而不是添加一个新的name=value,比如响应包头中有一个字段:X-Response-Foo:1234,那么通过这个过滤器将会变为:X-Response-Foo:Bar返回给客户端。

5.19 SetStatus GatewayFilter Factory

  这个过滤器工厂的实现类是:SetStatusGatewayFilterFactory,它需要一个status参数,这个参数必须是一个有效的Spring HttpStatus状态值,这个status可以是整数值404,也可以HttpStatus枚举的名字字符值,NOT_FOUND,如下面配置所示:

spring:
  cloud:
    gateway:
      routes:
      - id: setstatusstring_route
        uri: http://example.org
        filters:
        - SetStatus=BAD_REQUEST
      - id: setstatusint_route
        uri: http://example.org
        filters:
        - SetStatus=401

在这个示例中,响应的Http 状态会被设置为401,这个过滤器可以用来限制旧的接口不可访问,防止不存在的地址转发到后面的服务。


 

 点击查看,支持一下

 

posted @ 2019-09-16 15:18  王广帅  阅读(2276)  评论(1编辑  收藏  举报