0%

GateWay过滤器

GateWay过滤器

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,只能指定路由进行使用,由GatewayFilter的工厂类来产生,Gateway官方提供了很多的路由过滤器,也可以实现自己的自定义过滤器

内置过滤器

请求头/响应头过滤器

  • AddRequestHeaderGatewayFilterFactory

  • AddResponseHeaderGatewayFilterFactory

  • DedupeResponseHeaderGatewayFilterFactory 处理重复响应头

    有三种策略 RETAIN_FIRST、RETAIN_LAST、RETAIN_UNIQUE

    1
    2
    3
    4
    5
    spring:
    cloud:
    gateway:
    default-filters:
    - DedupeResponseHeader=Access-Control-Allow-Credentials, RETAIN_LAST #规则写在最后
  • PreserveHostHeaderGatewayFilterFactory

  • RemoveRequestHeaderGatewayFilterFactory
  • RemoveResponseHeaderGatewayFilterFactory
  • RequestHeaderSizeGatewayFilterFactory
  • SecureHeadersGatewayFilterFactory
  • SetRequestHeaderGatewayFilterFactory
  • SetResponseHeaderGatewayFilterFactory

请求参数过滤器

  • AddRequestParameterGatewayFilterFactory

    1
    2
    3
    4
    5
    spring:
    cloud:
    gateway:
    default-filters:
    - AddRequestHeader=X-Request-red, blue
  • RemoveRequestParameterGatewayFilterFactory

路径过滤器

  • PrefixPathGatewayFilterFactory 为匹配的url添加指定前缀

    1
    2
    3
    4
    5
    spring:
    cloud:
    gateway:
    default-filters:
    - PrefixPath=/mypath # 增加指定前缀,如/hello变成/mypath/hello
  • RewritePathGatewayFilterFactory 采用正则表达式替换参数

    1
    2
    3
    4
    5
    spring:
    cloud:
    gateway:
    default-filters:
    - RewritePath=/red/?(?<segment>.*), /$\{segment} # 两个参数,一个是请求路径的正则表达式,一个是替换的路径参数,如/red/blue会变成/blue
  • SetPathGatewayFilterFactory

  • StripPrefixGatewayFilterFactory 在将请求发送到下游之前从请求中剥离的路径个数

    1
    2
    3
    4
    5
    spring:
    cloud:
    gateway:
    default-filters:
    - StripPrefix=2 # 如/mypath/red/blue会变成/blue

请求体/响应体过滤器

  • RequestSizeGatewayFilterFactory

响应状态过滤器

  • SetStatusGatewayFilterFactory

    1
    2
    3
    4
    5
    spring:
    cloud:
    gateway:
    default-filters:
    - SetStatus=401

会话过滤器

  • SaveSessionGatewayFilterFactory

重定向过滤器

  • RedirectToGatewayFilterFactory

重试过滤器

  • RetryGatewayFilterFactory

限流过滤器

  • RequestRateLimiterGatewayFilterFactory

自定义

自定义全局过滤器

实现自定义的全局过滤器,需要实现GlobalFilter和Ordered接口,全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,为请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("过滤器进入");
String token = exchange.getRequest().getQueryParams().getFirst("token");
if(StringUtils.isBlank(token)){
System.out.println("不包含token");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}

// 继续执行过滤器链
return chain.filter(exchange);
}

@Override
public int getOrder() {
return 0;
}
}

全局过滤器不需要在配置文件中配置

自定义网关过滤器

实现GatewayFilter方式

需要实现GatewayFilter和Ordered接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class MyCustomFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("自定义过滤器进入");
// 继续执行过滤器链
return chain.filter(exchange);
}

@Override
public int getOrder() {
return 0;
}
}

需要使用java编码来配置自定义过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class MyConfig {
/**配置自定义过滤器*/
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes().route(r ->
r.path("/provider/**")//用户访问的路径
.uri("lb://service-provider")//路由的真实服务器ip+端口
.filters(new MyCustomFilter()) // 局部过滤器
.id("provider_route")) // 路由id
.build();
}
}

使用GatewayFilter还需要硬编码,不太好用,那么有没有更方便的方式呢?

继承AbstractGatewayFilterFactory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyCustomGatewayFilterFactory extends AbstractGatewayFilterFactory<MyCustomGatewayFilterFactory.Config> {

public MyCustomGatewayFilterFactory() {
super(Config.class);
}

@Override
public GatewayFilter apply(Config config, Class<Config> configClass) {
// 在这里创建并返回过滤器实例
return (exchange, chain) -> {
// 过滤器逻辑
return chain.filter(exchange);
};
}

public static class Config {
// 过滤器的配置参数
}
}

配置

1
2
3
4
5
6
7
8
9
10
spring:
cloud:
gateway:
routes:
- id: my
uri: http://example.com
filters:
- MyCustom=1
predicates:
- Path=/api/**

欢迎关注我的其它发布渠道