本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
gateway中filter的使用
1.局部过滤器GatewayFilter
第一种
使用局部过滤器首先继承AbstractGatewayFilterFactory抽象类
@Component
public class AuthGatewayFilter extends AbstractGatewayFilterFactory {
@Autowired
private IgnoreWhiteProperties ignoreWhiteProperties;
@Override
public GatewayFilter apply(Object config) {
//返回Gateway对象
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
// 如果是白名单路径直接放行
if (ignoreWhiteProperties.getWhites().contains(path)) {
return chain.filter(exchange);
} else {
throw new ServiceBizException("令牌认证失败", 401)
}
return chain.filter(exchange)
};
}
}
第二种
实现 GatewayFilter接口
@Component
public class AuthGatewayFilter implements GatewayFilter {
@Autowired
private IgnoreWhiteProperties ignoreWhiteProperties;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
// 如果是白名单路径直接放行
if (ignoreWhiteProperties.getWhites().contains(path)) {
return chain.filter(exchange);
}
return chain.filter(exchange);
}
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
@Autowired
private AuthGatewayFilter authGatewayFilter;
@Override
public GatewayFilter apply(Object config) {
return authGatewayFilter;
}
}
局部过滤器还需要再配置文件中指定使用哪一个过滤器
- id: mt-user-service // 服务名
uri: lb://mt-user-service
predicates:
- Path=/api/mtuser/** // 路由匹配以/api/mtuser/开头的请求都转发到mt-user-service服务
filters:
- StripPrefix=2 // 转发到mt-user-service的真实路径是/api/mtuser/**后的**,1的话就是过滤一层变成/mtuser/**
- Auth // 指定使用的过滤器AuthGatewayFilter写成Auth就可以了
- predicates:- Path指定路径前缀
- filters:- StripPrefix=2过滤路径前缀几层
- filters:- Auth使用的局部过滤器名称
2.全局过滤器
@Component
@Slf4j
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Autowired
private IgnoreWhiteProperties ignoreWhiteProperties;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
// 如果是白名单路径直接放行
if (ignoreWhiteProperties.getWhites().contains(path)) {
return chain.filter(exchange);
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
实现GlobalFilter接口中的filter方法,具体的处理逻辑与局部过滤器一致。
- GatewayFilter : 需要通过spring.cloud.routes.filters 配置在具体路由下
- GlobalFilter : 全局过滤器,不需要在配置文件中配置,作用在所有的路由上