Spring Cloud使用Zuui过滤拦截

原创
2020/03/18 19:28
阅读数 183

前言

Zuul 可以实现很多高级的功能,比如限流、认证等。想要实现这些功能,必须要基于 Zuul 给我们提供的核心组件“过滤器”。下面我们一起来了解一下 Zuul 的过滤器。

过滤器类型

1 pre 可以在请求被路由之前调用。适用于身份认证的场景,认证通过后再继续执行下面的流程。 2 route 在路由请求时被调用。适用于灰度发布场景,在将要路由的时候可以做一些自定义的逻辑。 3 post 在 route 和 error 过滤器之后被调用。这种过滤器将请求路由到达具体的服务之后执行。适用于需要添加响应头,记录响应日志等应用场景。 4 error 处理请求时发生错误时被调用。在执行过程中发送错误时会进入 error 过滤器,可以用来统一记录错误信息。

代码实现

我们可以模拟token 请验证正确的token,非法的token进行拦截。

继承 ZuulFilter

package com.example.zuui.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.ZuulFilterInitializer;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @description: zuui 过滤器
 * @author: Administrator
 * @create: 2019-12-02 22:31
 **/
@Component
public class ZuuiFilter extends ZuulFilter {

    /**
     * 过滤器类型,可选值有 pre、route、post、error。
     * @return
     */
    @Override
    public String filterType() {
        System.out.println("前置请求");
        return "pre";
    }

    /**
     * 过滤器的执行顺序,数值越小,优先级越高。
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否执行该过滤器,true 为执行,false 为不执行,这个也可以利用配置中心来实现,达到动态的开启和关闭过滤器。
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }


    /**
     * 执行自己的业务逻辑,本段代码中是通过判断请求的 IP 是否在黑名单中,决定是否进行拦截。blackIpList 字段是 IP 的黑名单,判断条件成立之后,
     * 通过设置 ctx.setSendZuulResponse(false),告诉 Zuul 不需要将当前请求转发到后端的服务了。
     * 通过 setResponseBody 返回数据给客户端。
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {

        RequestContext ctx = RequestContext.getCurrentContext();

        HttpServletRequest request = ctx.getRequest();
        HttpServletResponse response = ctx.getResponse();
        String token = request.getParameter("token");

        if(!"123".equals(token)){
            System.out.println("非法请求");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.setResponseBody("非法请求!");
            ctx.getResponse().setContentType("application/json; charset=utf-8");
            return null;
        }

        System.out.println("验证通过");
        return null;
    }
}

结果显示

错误拦截 在这里插入图片描述

验证通过

在这里插入图片描述

代码地址 传送门

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部