Version: Next
Filter 过滤器
允许在网关路由转发之前、之后做额外处理
- 生命周期:
pre
转发前post
转发后- 种类:
GatewayFilter
GlobalFilter
例:修改匹配的请求,给其增加一个请求头,名称为
X-Request-ID
,值为1024
routes:- id: payment_route2#uri: http://localhost:8081uri: lb://cloud-payment-servicepredicates:- 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
- 实现
GlobalFilter
、Ordered
接口getOrder
方法设置过滤器优先级- 设置自定义过滤器
- 必须有
uname
参数才能通过过滤器@Component@Slf4jpublic class MyLogGatewayFilter implements GlobalFilter, Ordered {@Overridepublic 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);}/*** 加载过滤器的顺序,数字越小,优先级越高*/@Overridepublic int getOrder() {return 0;}}