Version: Next

Filter 过滤器

允许在网关路由转发之前、之后做额外处理

  • 生命周期:
    • pre 转发前
    • post 转发后
  • 种类:
    • GatewayFilter
    • GlobalFilter

例:修改匹配的请求,给其增加一个请求头,名称为 X-Request-ID,值为 1024

routes:
- id: payment_route2
#uri: http://localhost:8081
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
#- After=2020-03-12T15:44:15.064+08:00[Asia/Shanghai] # 在这个时间之后才做路由映射
#- Cookie=username,bsx #带Cookie,并且username的值为bsx
#- Header=X-Request-Id,\d+ #请求头要有 X-Request-Id属性并且值为整数的正则表达式
#- Method=GET # 必须是 GET 请求
filters:
- AddRequestParameter = X-Request-Id,1024 # 修改匹配的请求,给其增加一个请求头,名称为 `X-Request-ID`,值为 `1024`
  • 其他默认用法去文档查

自定义过滤器

  • 实现两个接口:
    • GlabalFilter
    • Ordered:加载过滤器的顺序,数组越小优先级越高

案例:全局日志过滤器

  • 新建 filter.MyLogGatewayFilter
  • 实现 GlobalFilterOrdered 接口
  • getOrder 方法设置过滤器优先级
  • 设置自定义过滤器
    • 必须有 uname 参数才能通过过滤器
@Component
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("****** come in MyLogGateWayFilter: " + new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if (uname == null) {
log.info("*****用户名为null,非法用户,o(╥﹏╥)o");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
/**
* 加载过滤器的顺序,数字越小,优先级越高
*/
@Override
public int getOrder() {
return 0;
}
}