4-Zuul网关过滤器(学习笔记2020.3.16)

36 篇文章 2 订阅
4 篇文章 0 订阅

Zuul网关过滤器(学习笔记2020.3.16)

前言:

过滤器是Zuul的核心组件,Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期! 学习这些过滤器,我们可以自定义一些过滤器来进行统一过滤功能, 例如: 统一验证token ,统一验证参数等等!

Zuul中定义了四种标准过滤器类型

过滤器中参数说明:

filterType:过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。

8JHaM4.jpg
  1. pre —这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、token验证等。
  2. route —这种过滤器在路由发送请求时候被调用。这种过滤器用于构建发送给微服务的请求,并使用 Apache HttpClientNetfilx Ribbon 请求微服务。
  3. post —在routeerror过滤器之后被调用, 这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
  4. error —在其他阶段发生错误时执行该过滤器。

filterOrder:过滤器的执行顺序。当请求在一个阶段中存在多个过滤器时,需要根据该方法返回的值来依次执行, 数字越大,优先级越低。

shouldFilter:判断该过滤器是否需要被执行。直接返回了true,因此该过滤器对所有请求都会生效执行。实际运用中我们可以利用该函数来指定过滤器的有效范围是否执行。

run:过滤器的具体逻辑。这里通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码,当然我们也可以进一步优化返回,比如,通过ctx.setResponseBody(body)对返回body内容进行编辑等。

Zuul中默认实现的 Filter

类型顺序过滤器功能
pre-3ServletDetectionFilter标记处理 Servlet 的类型
pre-2Servlet30WrapperFilter包装 HttpServletRequest 请求
pre-1FormBodyWrapperFilter包装请求体
route1DebugFilter标记调试标志
route5PreDecorationFilter处理请求上下文供后续使用
route10RibbonRoutingFilterserviceId 请求转发
route100SimpleHostRoutingFilterurl 请求转发
route500SendForwardFilterforward 请求转发
post0SendErrorFilter处理有错误的请求响应
post1000SendResponseFilter处理正常的请求响应
如果需要禁用Zuul过滤器

Spring Cloud的Zuul在代理和服务器模式下默认启用了多个ZuulFilter bean。有关启用的可能过滤器,请参阅zuul过滤器包。如果要禁用它,只需设置zuul...disable=true。按照惯例,filters之后的包是Zuul过滤器类型。例如,禁用org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter设置zuul.SendResponseFilter.post.disable=true

一: 实现一个简单的过滤器!

来过滤器请求头中没有带有Authorization的请求

/**
 * @Author: 
 * @Date: 2020/3/16 17:23
 * @Description: 网关过滤,没有带有Authorization的请求
 * @Versions 1.0
 **/
@Component //注意要注册bean到框架才会生效
public class MyZuulFilter extends ZuulFilter {

    @Override//什么类型的过滤器
    public String filterType() {
        return "pre";
    }

    @Override   //过滤器优先级,数字越大,优先级越低。
    public int filterOrder() {
        return -4;
    }

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

    @Override //过滤器执行的主要逻辑
    public Object run() throws ZuulException {
        //获取当前请求上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        //获取请求对象
        HttpServletRequest request = currentContext.getRequest();
        //获取请求头
        String authorization = request.getHeader("Authorization");
        if (null != authorization){
            //有请求头就放行
            return null;
        }
        //为空拦截请求
        currentContext.setSendZuulResponse(false);
        currentContext.setResponseBody("你没有拥有此权限");
        //获取响应对象
        HttpServletResponse response = currentContext.getResponse();
        //设置没有权限码
        response.setStatus(404);
        //设置响应格式
        response.setContentType("text/html;charset=UTF-8");
        return null;
    }
}

到此就简单实现了个判断是否有请求头的自定义zuul过滤器, //注意要注册bean到框架才会生效

RequestContextzuul提供的请求上下文API (点击打开查询)

未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懵懵懂懂程序员

如果节省了你的时间, 请鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值