全局过滤器的作用也是处理一切进入网关的请求和微服务响应。
与GatewayFilter的作用一样(filters, default-filters)
区别
GatewayFilter通过配置定义,处理逻辑是固定的。
GlobalFilter的逻辑需要自己写代码实现,可以自定义。
exchange表示 请求上下文,请求进入网关开始,一直到结束为止,整个流程中都可以共享exchange对象,可以拿到请求相关信息,响应相关信息。
chain 过滤器链,链条上除了GlobalFilter外还有别的过滤器。用来把请求委托给下一个过滤器。
应用案例
定义全局过滤器,拦截请求,判断请求的参数是否满足下面的条件:
参数中是否有authorization, authorization参数值是否为admin,如果同时满足则防线,否则拦截。
gateway微服务中定义全局过滤器的实现类
@Order(-1) //设置优先级,数字越小优先级越高
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取请求对象
ServerHttpRequest request = exchange.getRequest();
//2.获取请求参数
MultiValueMap<String, String> queryParams = request.getQueryParams();
//3.获取参数中的authorization
String authorization = queryParams.getFirst("authorization");
//4.判断参数值是否为admin
if("admin".equals(authorization)) {
//5.是放行
return chain.filter(exchange);
}else {
//6.否拦截,设置状态码为未登录,拦截请求
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
}