【4】Spring cloud Zuul 网关过滤

Zuul提供一个框架,可以对Groovy写的过滤器进行动态的加载、编译、运行。过滤器之间没有直接的相互通信,通过一个RequestContext的静态类中ThreadLocal变量来进行数据传递,过滤器类型:

  • PRE:这种过滤器在请求到达Origin Server之前调用。比如身份验证,在集群中选择请求的Origin Server,记log等;
  • ROUTING:在这种过滤器中把用户请求发送给Origin Server。发送给Origin Server的用户请求在这类过滤器中build。并使用Apache HttpClient或者NetfilxRibbon发送给Origin Server;
  • POST:这种过滤器在用户请求从Origin Server返回以后执行。比如在返回的response上面加response header,做各种统计等。并在该过滤器中把response返回给客户;
  • ERROR:在其他阶段发生错误时执行该过滤器;
  • 客户定制:比如我们可以定制一种STATIC类型的过滤器,用来模拟生成返回给客户的response;
  1. 创建过滤器 TokenFilter 继承 ZuulFilter

public class TokenFilter extends ZuulFilter {

    /**
     * 四种类型:pre,routing,error,post
     * pre:主要用在路由映射的阶段是寻找路由映射表的
     * routing:具体的路由转发过滤器是在routing路由器,具体的请求转发的时候会调用
     * error:一旦前面的过滤器出错了,会调用error过滤器。
     * post:当routing,error运行完后才会调用该过滤器,是在最后阶段的
     * @return
     */
    @Override
    public String filterType() {

        return "pre";
    }

    /**
     * 自定义过滤器执行的顺序,数值越大越靠后执行,越小就越先执行
     * @return
     */
    @Override
    public int filterOrder() {

        return 0;
    }

    /**
     * 控制过滤器生效不生效,可以在里面写一串逻辑来控制
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 执行过滤逻辑
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getParameter("token");
        if (token == null){
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(401);
            context.setResponseBody("unAuthrized");
            return null;
        }

        return null;
    }
}

  1. 将过滤器 TokenFilter 注入到spring 容器中
@SpringBootApplication
@EnableZuulProxy
public class SpringCloudZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudZuulApplication.class, args);
    }

    @Bean
    public TokenFilter tokenFilter(){
        return new TokenFilter();
    }

}
  1. 启动项目开始测试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值