如果我们希望拦截请求,做自己的业务逻辑,Spring Cloud Gateway中默认的过滤器就没办法实现。此时,就需求使用全局过滤器,全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
以下是个配置自定义全局过滤器并在过滤器内部处理业务逻辑的示例:
- 需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
请求参数中是否有username,如果满足则放行,否则拦截
1、定义一个类实现GlobalFilter接口
2、重写filter方法
3、将该类纳入到spring容器中
4、实现Ordered接口定义该过滤器的顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Component public class AuthorizationFilter implements GlobalFilter, Ordered {
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String username = exchange.getRequest().getQueryParams().getFirst("username"); if(!StringUtils.hasText(username)){ exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); }
@Override public int getOrder() { return 0; } }
|