zoukankan      html  css  js  c++  java
  • 使用路由网关的服务过滤功能

    概述

    Zuul 不仅仅只是路由,还有很多强大的功能,本节演示一下它的服务过滤功能,比如用在安全验证方面。

    #创建服务过滤器

    继承 ZuulFilter 类并在类上增加 @Component 注解就可以使用服务过滤功能了,非常简单方便

    package com.funtl.hello.spring.cloud.zuul.filter;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    /**
     * Zuul 的服务过滤演示
     * <p>Title: LoginFilter</p>
     * <p>Description: </p>
     *
     * @author snake
     * @version 1.0.0
     * @date 2018/5/29 22:02
     */
    @Component
    public class LoginFilter extends ZuulFilter {
    
        private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);
    
        /**
         * 配置过滤类型,有四种不同生命周期的过滤器类型
         * 1. pre:路由之前
         * 2. routing:路由之时
         * 3. post:路由之后
         * 4. error:发送错误调用
         * @return
         */
        @Override
        public String filterType() {
            return "pre";
        }
    
        /**
         * 配置过滤的顺序
         * @return
         */
        @Override
        public int filterOrder() {
            return 0;
        }
    
        /**
         * 配置是否需要过滤:true/需要,false/不需要
         * @return
         */
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        /**
         * 过滤器的具体业务代码
         * @return
         * @throws ZuulException
         */
        @Override
        public Object run() throws ZuulException {
            RequestContext context = RequestContext.getCurrentContext();
            HttpServletRequest request = context.getRequest();
            logger.info("{} >>> {}", request.getMethod(), request.getRequestURL().toString());
            String token = request.getParameter("token");
            if (token == null) {
                logger.warn("Token is empty");
                context.setSendZuulResponse(false);
                context.setResponseStatusCode(401);
                try {
                    context.getResponse().getWriter().write("Token is empty");
                } catch (IOException e) {
                }
            } else {
                logger.info("OK");
            }
            return null;
        }
    }

    #filterType

    返回一个字符串代表过滤器的类型,在 Zuul 中定义了四种不同生命周期的过滤器类型

    • pre:路由之前
    • routing:路由之时
    • post: 路由之后
    • error:发送错误调用

    #filterOrder

    过滤的顺序

    #shouldFilter

    是否需要过滤,这里是 true,需要过滤

    #run

    过滤器的具体业务代码

    #测试过滤器

    浏览器访问:http://localhost:8769/api/a/hi?message=HelloZuul 网页显示

    Token is empty

    浏览器访问:http://localhost:8769/api/b/hi?message=HelloZuul&token=123 网页显示

    Hi,your message is :"HelloZuul" i am from port:8763
    等你看到的时候,想变得有一点点不一样
  • 相关阅读:
    从新注册 .DLL CMD 运行regsvr32 *.dll注册该DLL 或 regsvr32 /s *.DLL 求证
    短信猫 TIdTCPServer TIdTCPClient
    转:Delphi和Office程序开发 --不错可查阅
    主窗体里面打开子窗体&&打印饼图《Delphi 6数据库开发典型实例》--图表的绘制
    TeeChart Pro 5.0
    软件打开时间、窗体透明度、背景色---《用delphi开发共享软件》-15.1任务管理器
    设置随机启动--《用delphi开发共享软件》-15.1任务管理器
    实现窗体随着鼠标移动(控件)--《用delphi开发共享软件》-15.1任务管理器
    第二百六十一节,Tornado框架模板引擎本质
    第二百六十节,Tornado框架-内置模板方法
  • 原文地址:https://www.cnblogs.com/snake107/p/11920661.html
Copyright © 2011-2022 走看看