美文网首页Java学习笔记
Chapter Zuul系列1-自定义Zuul过滤器

Chapter Zuul系列1-自定义Zuul过滤器

作者: 韧卓 | 来源:发表于2018-02-13 17:22 被阅读432次

    一、创建项目

    使用Intellij的Spring Initializr创建Spring Boot项目,增加Zuul的依赖项目。

    二、创建过滤器

    自定义过滤器需要扩展ZuulFilter类,并覆盖以下四个方法。

    public class ZuulPreLogFilter extends ZuulFilter {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ZuulPreLogFilter.class);
    
        @Override
        public String filterType() {
            return "pre";
        }
    
        @Override
        public int filterOrder() {
            return 1;
        }
    
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        @Override
        public Object run() {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
            ZuulPreLogFilter.LOGGER.info(String.format("Send %s request to %s", request.getMethod(), 
                                            request.getRequestURL().toString()));
            return null;
        }
    }
    

    覆盖方法意义解释:

    1. filterType:返回过滤器的类型。有pre、route、post、error等几种取值,分别对应上文的几种过滤器。详细可以参考com.netflix.zuul.ZuulFilter.filterType()中的注释。
    2. filterOrder:返回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字。
    3. shouldFilter:返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行
    4. run:过滤器的具体逻辑。本例中,我们让它打印了请求的HTTP方法以及请求的地址。

    三、启动过滤器

    • 注入ZuulPreLogFilter对象
    • 注解开启Zuul代理转发功能
    • 注解增加路由控制器
    @EnableZuulProxy
    @RestController
    @SpringBootApplication
    public class ZuulfiltertestApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ZuulfiltertestApplication.class, args);
        }
    
        @Bean
        public ZuulPreLogFilter zuulPreFilter() {
            return new ZuulPreLogFilter();
        }
    
        @RequestMapping("/")
        public String index(){
            return "This is index!";
        }
    }
    

    四、配置路由转发

    zuul.routes.baidu.path=/baidu/**
    zuul.routes.baidu.url=http://www.baidu.com/
    

    五、结果验证

    从以上代码可以看出,可以访问的路由有两条:

    • 路由1:"/"根路径,响应结果是打印如下内容:"This is index!";
    • 路由2:"/baidu",响应结果是跳转到百度搜索页面。

    抛出疑问,以上两条路由是否都会被zuulFilter过滤?

    揭秘:

    实际只有"/baidu"一个路由经过了zuulFilter的过滤,打印了日志:Send GET request to http://localhost:9999/baidu
    这是因为该路由经由zuul代理转发,而根路径只是路由映射,因此没有经过zuul过滤器的生命周期。

    相关文章

      网友评论

        本文标题:Chapter Zuul系列1-自定义Zuul过滤器

        本文链接:https://www.haomeiwen.com/subject/unojtftx.html