SpringCloud gateway内置过滤器之三

发布时间 2023-05-06 13:36:24作者: shigp1

1、RedirectTo GatewayFilter

RedirectTo GatewayFilter接受两个参数,状态和url。状态参数应该是一个300系列的重定向HTTP代码,例如301。url参数应该是一个有效的url。这是Location标头的值。对于相对重定向,应该使用uri:no://op作为路由定义的uri。例如:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - RedirectTo=302, https://www.baidu.com

访问http://localhost:8500/producer/hello,将重定向到https://www.baidu.com。

2、RemoveRequestHeader GatewayFilter

RemoveRequestHeader GatewayFilter删除指定的请求头。

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - RemoveRequestHeader=X-Request-Foo

用Postman访问http://localhost:8500/producer/hello,
 

 

从Producer模块的控制台看到System.out.println(request.getHeader("X-Request-Foo"));获取请求头为null。

3、RemoveResponseHeader GatewayFilter

RemoveResponseHeader GatewayFilter移除响应头。

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - RemoveResponseHeader=X-Response-Foo

在修改Producer的Controller:

@RequestMapping("/hello")
public String hello(String name, HttpServletRequest request, HttpServletResponse response) {
    response.setHeader("X-Response-Foo","123");
    return "hello," + name + "," + port;
}

访问http://localhost:8500/producer/hello,从浏览器控制台看到没有X-Response-Foo响应头。将RemoveResponseHeader注释掉,在访问http://localhost:8500/producer/hello,看到
 

 

4、RemoveRequestParameter GatewayFilter

RemoveRequestParameter GatewayFilter会移除指定的请求参数。

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - RemoveRequestParameter=red

修改Producer服务的Controller:

@RequestMapping("/hello")
public String hello(String name, HttpServletRequest request, HttpServletResponse response) {
    System.out.println(request.getParameter("red"));
    return "hello," + name + "," + port;
}

访问http://localhost:8500/producer/hello?red=123,看到Producer控制台显示null。将RemoveRequestParameter注释。在访问http://localhost:8500/producer/hello?red=123,看到Producer控制台显示123。

5、RewritePath GatewayFilter

RewritePath GatewayFilter采用一个路径regexp参数和一个替换参数。这使用Java正则表达式来灵活地重写请求路径。

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - RewritePath=/red, /hello

将/producer/red替换成/producer/hello。访问http://localhost:8500/producer/red,看到hello,null,8002。