springCloud(三)gateway登录拦截

29 阅读1分钟

过滤

过滤类

//config/Test1Filter.java

@Component
public class Test1Filter implements GlobalFilter {

    private static final Logger LOG = LoggerFactory.getLogger(Test1Filter.class);
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        LOG.info("test1filer");
        return null;
    }
}

测试效果

image.png

多个过滤器优先级

@Component
public class Test1Filter implements GlobalFilter, Ordered {

    private static final Logger LOG = LoggerFactory.getLogger(Test1Filter.class);
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        LOG.info("test1filer");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

image.png

全局过滤

@Component
public class LoginMemberFilter implements GlobalFilter {
    private static final Logger LOG = LoggerFactory.getLogger(LoginMemberFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String path = exchange.getRequest().getURI().getPath();

        // 排除不需要拦截的请求
        if (path.contains("/admin")
                || path.contains("/hello")) {
            LOG.info("不需要登录验证:{}", path);
            return chain.filter(exchange);
        } else {
            LOG.info("需要登录验证:{}", path);
        }

        // 获取header的token参数
        String token = exchange.getRequest().getHeaders().getFirst("token");
        LOG.info("会员登录验证开始,token:{}", token);
        if (token == null || token.isEmpty()) {
            LOG.info( "token为空,请求被拦截" );
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

}

测试效果

不需要验证的接口

image.png

image.png

image.png

需要验证的接口

无token

image.png

有token image.png