路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用
SpringCloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来生成
SpringCloud Gateway的 Filter,生命周期有 pro 和 post,
种类有GatewayFilter 和 GlobalFilter
常用的GatewayFilter 有31种之多
GlobalFilter 有10个
这里主要介绍一下自定义全局GlobalFilter
需要实现两个接口:GlobalFilter、Ordered
能做什么?
全局日志记录
统一网关鉴权
案例代码
添加一个过滤器类继承GlobalFilter、Ordered
package com.atguigu.springcloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
/**
* @author wsk
* @date 2020/3/15 18:10
*/
@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");//每次进来后判断带不带uname这个key
if(uname == null){
log.info("*********用户名为null ,非法用户,o(╥﹏╥)o");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); //uname为null非法用户
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
重启测试
只有带uname 参数才能访问成功,不带或带的参数不是uname 都不能访问