为了能够在api网关中实现对客户端请求的校验,我们将继续介绍spring cloud zuul的另外一个核心功能:请求过滤。zuul允许开发这在api-gateway网关上通过定义过滤器来实现对请求的核心拦截与过滤,实现的方法非常简单。

重构工程(springcloud-server-api-gateway)

新建过滤类

public class AccessFilter extends ZuulFilter {
    private final Logger _logger = LoggerFactory.getLogger(this.getClass()) ;
    @Override
    public String filterType() {
        return "pre";
    }

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

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext() ;
        HttpServletRequest request = ctx.getRequest() ;

        _logger.info("send {} to {}",request.getMethod(),request.getRequestURL().toString());

        Object token = request.getParameter("token") ;
        if(null == token){
            _logger.error("token is null ...");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
        }else{
            _logger.info("access token is ok!!!");
        }
        return null;
    }
}

注册过滤器

@Configuration
public class ApiGatewayConfig {

    @Bean
    public AccessFilter accessFilter(){
        return new AccessFilter();
    }
}

调用效果图

调用原来的接口,

调用地址:http://localhost:8004/api-b/api/rest/getMessage

这里写图片描述

调用地址:http://localhost:8004/api-b/api/rest/getMessage?token=sss

这里写图片描述

源码

springcloud-server-eureka

springcloud-producer-rest

springcloud-consumer-feign

springcloud-consumer-ribbon

springcloud-server-api-gateway

历史文章

springcloud实战之1 技术选型:dubbo还是springcloud

springcloud实战之2 服务注册与发现(eureka实现)

springcloud实战之3 高可用服务注册中心(eureka集群)

springcloud实战之5 服务消费者(ribbon)

springcloud实战之6 服务消费者(Feign)

springcloud实战之7 断路器(Hystrix)

springcloud实战之8 断路器-仪表盘-单例监控(Hystrix)

springcloud实战之9断路器-集群监控(turbine)

springcloud实战之10 分布式配置中心(config)

springcloud实战之11路由网关(zuul)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐