Spring Gateway 前置和后置过滤器(pre、post)

377 阅读1分钟

在写网关的过滤器的时候,我们通常会有两种需求场景

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;
        }
    }
}