在写网关的过滤器的时候,我们通常会有两种需求场景
1、转发请求前执行的逻辑,例如token校验、签名校验等
2、请求完成后执行的逻辑,例如对返回值进行一些加工等等
哪怎么实现呢,其实很简单,接下来给大家举几个实例
以下使用的是局部过滤器来举例,全局过滤器也是一样的写法,没有任何区别
前置过滤器(请求转发前触发)
@Component
public class GetRecordGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
private static final Logger LOGGER = LoggerFactory.getLogger(GetRecordGatewayFilterFactory.class);
@Override
public GatewayFilter apply(Object config) {
return new DDOSCheckGatewayFilter();
}
static class DDOSCheckGatewayFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
LoggerUtils.info(LOGGER, "请求转发前触发");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
}
后置过滤器(请求完成后触发)
@Component
public class GetRecordGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
private static final Logger LOGGER = LoggerFactory.getLogger(GetRecordGatewayFilterFactory.class);
@Override
public GatewayFilter apply(Object config) {
return new DDOSCheckGatewayFilter();
}
static class DDOSCheckGatewayFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.fromRunnable(new Runnable() {
@Override
public void run() {
LoggerUtils.info(LOGGER, "请求完成后触发");
}
}));
}
@Override
public int getOrder() {
return 0;
}
}
}
前置 + 后置过滤器(请求完成后触发)
@Component
public class GetRecordGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
private static final Logger LOGGER = LoggerFactory.getLogger(GetRecordGatewayFilterFactory.class);
@Override
public GatewayFilter apply(Object config) {
return new DDOSCheckGatewayFilter();
}
static class DDOSCheckGatewayFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 进入filter方法,执行chain.filter,都属于请求前阶段
LoggerUtils.info(LOGGER, "转发请求前触发");
return chain.filter(exchange).then(Mono.fromRunnable(new Runnable() {
@Override
public void run() {
LoggerUtils.info(LOGGER, "请求完成后触发");
}
}));
}
@Override
public int getOrder() {
return 0;
}
}
}