从过滤器⽣命周期(影响时机点)的⻆度来说,主要有两个pre和post:
⽣命周期时机点 | 作⽤ |
pre | 这种过滤器在请求被路由之前调⽤。我们可利⽤这种过滤器实现身份 验证、在集群中选择 请求的微服务、记录调试信息等。 |
post | 这种过滤器在路由到微服务以后执⾏。这种过滤器可⽤来为响应添加 标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给 客户端等。 |
从过滤器类型的⻆度,Spring Cloud GateWay的过滤器分为GateWayFilter和
GlobalFilter两种
过滤器类型 | 影响范围 |
GateWayFilter | 应⽤到单个路由路由上 |
GlobalFilter | 应⽤到所有的路由上 |
业界大多数都是直接使用GlobalFilter进行编写过滤器的,所以我们着重看一下这个类的实现代码
场景:模拟白黑名单限制,在黑名单中的ip,如果在访问接口的时候,网关直接返回错误信息提示
话不多说,直接上代码:
@Slf4j
@Component
public class BlackListFilter implements GlobalFilter, Ordered {
private static List<String> blackList = new ArrayList<>();
static {
blackList.add("0:0:0:0:0:0:0:1"); // 模拟本机地址
}
/**
* 返回值表示当前过滤器的顺序(优先级),数值越⼩,优先级越⾼
* @return
*/
@Override
public int getOrder() {
return 0;
}
/**
* 过滤器核⼼⽅法
* @param exchange 封装了request和response对象的上下⽂
* @param chain ⽹关过滤器链(包含全局过滤器和单路由过滤器)
* @return
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 思路:获取客户端ip,判断是否在⿊名单中,在的话就拒绝访问,不在的话就放⾏
// 从上下⽂中取出request和response对象
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
// 从request对象中获取客户端ip
String clientIp = request.getRemoteAddress().getHostString();
// 拿着clientIp去⿊名单中查询,存在的话就决绝访问
if(blackList.contains(clientIp)) {
// 决绝访问,返回
response.setStatusCode(HttpStatus.UNAUTHORIZED); // 状态码
log.debug("=====>IP:" + clientIp + " 在⿊名单中,将被拒绝访问!");
String data = "Request be denied!";
DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
return response.writeWith(Mono.just(wrap));
}
// 合法请求,放⾏,执⾏后续的过滤器
return chain.filter(exchange);
}
}
demo链接如下(只供参考哈):https://gitee.com/IT_CB/cloud-gatewayhttps://gitee.com/IT_CB/cloud-gateway