0%

网关过滤器

GatewayFilter

  • GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理
  • Spring提供了31种不同的路由过滤器工厂,例如
名称 说明
AddRequestHeader 给当前请求添加一个请求头
RemoveRequestHeader 移除请求中的一个请求头
AddResponseHeader 给响应结果中添加一个请求头
RemoveResponseHeader 从响应结果中移除一个请求头
RequestRateLimiter 限制请求流量
  • yml配置文件中
1
2
3
4
5
6
7
8
spring:
cloud:
gateway:
routes:
filters: # 过滤器,对指定路由有效
- AddRequestHeader=Truth,Itcast is freaking aowsome!
default-filters: # 默认过滤器,对所有路由请求有效
- AddRequestHeader=Truth,Itcast is freaking aowsome!

全局过滤器GlobalFilter

  • 全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样
  • 区别在于GatewayFilter通过配置定义,处理逻辑固定。而GlobalFilter的逻辑需要自己代码实现
  • 定义方式是实现GlobalFilter接口
1
2
3
4
5
6
7
8
public interface GlobalFilter {
/*
处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
@param exchange 请求上下文,里面可以获取Request,Response等信息
@param chain 用来把请求委托给下一个过滤器
@return {@code Mono<Void>} 返回标示当前过滤器业务结束
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//设置过滤器优先级,值越小优先级越高,也可以实现Ordered接口
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

//1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();

//2.获取参数中的authorization参数
String auth = params.getFirst("authorization");

//3.判断参数是否等于admin,是,放行
if("admin".equals(auth)) {
return chain.filter(exchange);
}

//4.否,拦截
//4.1 设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置为未登录
//4.2 拦截请求
return exchange.getResponse().setComplete();

}
}

过滤器执行

  • 请求进入网关后会碰到三类过滤器:当前路由的过滤器,DefaultFilter,GlobalFilter
  • 请求路由后,会将当前路由过滤器和DefaultFilter,GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器
  • 类型不同的问题:GlobalFilter会传入过滤器适配器,而适配器实现了GatewayFilter接口

过滤器执行顺序

  • 每一个过滤器都必须指定一个int类型的order值,order越小优先级越高
  • GlobalFilter通过实现Ordered接口或@Order注解指定Order值
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  • 当过滤器order一样时,会按照defaultFilter > 路由过滤器 > GlobalFilter的顺序执行
------ THEEND ------

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