【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
【这个跟default 不是一样的吗?】
区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。
定义方式是实现GlobalFilter接口。
【行吧】
定义全局过滤器,拦截并判断用户身份
需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
如果同时满足则放行,否则拦截
直接开干!
先来一个过滤器类
package cn.itcast.gateway;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* ClassName: AuthorizeFilter
* date: 2022/10/29 16:56
*
* @author DingJiaxiong
*/
//@Order(-1) //过滤器执行顺序,越小优先级越高
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1. 获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();
//2. 获取参数中的authorization 参数
String auth = params.getFirst("authorization");
//3. 判断参数值是否等于admin
if ("admin".equals(auth)){
//4. 是,放行
return chain.filter(exchange);
}
//5. 否,拦截
//5.1 设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//5.2 拦截请求
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return -1; //这样也是一样的道理,设置过滤器优先级
}
}
OK,这样过滤器就算定义好了,直接重启网关服务
OK,直接测试
可以看到直接访问,就是401
加上参数
没毛病
试试错误的参数
也是401 ,没毛病!
对所有路由都生效的过滤器,并且可以自定义处理逻辑
①实现GlobalFilter接口
②添加@Order注解或实现Ordered接口【过滤器一定要有顺序、不然执行结果可能会和预想的不一样】
③编写处理逻辑