spring cloud中zuul 实现过滤器操作

一.基础知识

Spring Cloud中默认已经为Zuul编写并启用了一些过滤器,这些过滤器都在spring-cloud-netflix-zuul这个Jar包的org.springframework.cloud.netflix.zuul.filters包中。

要实现Zuul的过滤器,就需要继承ZuulFilter的父类,实现filterType()、filterOrder()、shouldFilter()以及run()方法

(1)filterType()方法为获取该过滤器的类型
通过“FilterConstants”类中的Type常量,我们可以知晓,Zuul的标准过滤器一共有“error”、“post”、“pre”和“route”的类型:

PRE:这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择请求的微服务,记录调试信息等。
ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache?HttpClient或Netflix?Ribbon请求微服务。
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP header、收集统计信息和指标、将响应从微服务发送给客户端等。
ERROR:在其他阶段发送错误时执行该过滤器

(2)filterOrder()方法为获取过滤器在责任链中的顺序,其中数值越大,越后执行;
这里各个filter之间不直接进行交互,而是通过RequestContext来共享状态信息。
(3)shouldFilter()方法获取是否需要执行该过滤
(4)run()方法就是该过滤器的具体过滤逻辑的执行
总结:如果我们要自定义Zuul的Filter过滤器,继承ZuulFilter父类,并实现以上四个方法即可。Zuul会动态的读取,编译,运行新添加的filter。

二、编写Zuul的自定义过滤器

实现要求:查询如果是输入id,则正确通过,如果查实输入的是字符china,则过滤掉,不让其通过。

修改项目:ms-zuul-consumer在项目中新增一个过滤器

1.ChineseCharacterFilter过滤器:

package com.ljf.weifuwu.springcloud.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;

public class ChineseCharacterFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";//类型为p
    }

    @Override
    public int filterOrder() {
        return 1;//过滤器排序为1号
    }

    /**
     * 判断是否执行该过滤器
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;//执行该过滤器
    }

    @Override
    public Object run() {
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
         String URI = request.getRequestURI();
              if(URI.contains("/eureka-provider/")) {
                //获取RESTful风格请求URI"/user/findById/1" 中的“1"
                    String userName = URI.split("/")[3];
                   if(!StringUtils.isEmpty(userName)&&"china".equals(userName)) {
                        System.out.println("请求了UserId为"+userName+"的用户,有风险!!!");
                     }else {
                          System.out.println("请求了UserId不为china的用户,无风险~~");
                       }
                     }
             return null;


    }
}

  2.在启动类注册该类的实例bean:

    /**
     * 返回bean
     * @return
     */
    @Bean
    public ChineseCharacterFilter riskCheckFilter() {
        return new ChineseCharacterFilter();
    }

3.启动服务:ms-eureka-center(8761)、ms-eureka-provider(7901)、ms-zuul-consumer(8008) 

4.访问:

http://localhost:8008/user-zuul/eureka-provider/1

http://localhost:8008/user-zuul/eureka-provider/china

 

 

三、禁用Zuul的Filter过滤器 

需要对Zuul的某些过滤器进行禁用,我们只需要在配置文件中,通过以下格式来禁用某个过滤器即可:
zuul.<SimpleClassName>.<filterType>.disable=true

如本案例:zuul.ChineseCharacterFilter.pre.disable=ture

注意:标红的部分,需要根据情况动态调整。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章