目录
一、全局过滤器 GlobalFilter
二、案例实现
2.1 创建AuthorizeFilter实现类
2.2 重启服务测试
三、总结
3.1 全局过滤器的作用是什么?
3.2 实现全局过滤器的步骤?
一、全局过滤器 GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。
定义方式是实现GlobalFilter接口。
public interface GlobalFilter {
/**
* 处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理*
* @param exchange 请求上下文,里面可以获取Request、Response等信息
* @param chain 用来把请求委托给下一个过滤器
* @return {@code Mono<Void>} 返回标示当前过滤器业务结束
*/
Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) ;}
二、案例实现
需求(定义全局过滤器,拦截并判断用户身份):
定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
- 参数中是否有authorization
- authorization参数值是否为admin
如果同时满足则放行,否则拦截
2.1 创建AuthorizeFilter实现类
// ogder(int) 顺序注解,用于实现过滤器谁先执行的顺序,数值越小优先级越高,负数为最高
@ogder(-1)
// Component 注入到Spring当中 最为一个bean
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数ServerHttpRequest request = exchange.getRequestO;MultiValueMap<String,String> params = request.getQueryParams();// 2.获取参数中的 authorization 参数String auth = params,getFirst( key: "authorization");// 3断参数值是否等于 adminif ("admin".equals(auth)){// 4.是,放行return chain.filter(exchange);}// 5.否,拦截// 5.1.设置状态码exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2.拦截请求return exchange.getResponse(0.setComplete();}
}
2.2 重启服务测试
不加参数不可访问,证明过滤器已生效
加上请求参数后可以访问
三、总结
3.1 全局过滤器的作用是什么?
- 对所有路由都生效的过滤器,并且可以自定义处理逻辑
3.2 实现全局过滤器的步骤?
- 实现GlobalFilter接口
- 添加@Order注解或实现Ordered接口
- 编写处理逻辑