天天看点

SpringCloud学习笔记13zuul过滤器-IDEA版

1.新建一个LoginFilter类,我们来自定义一个zuul的登录拦截过滤器:

  • 目录结构:
    SpringCloud学习笔记13zuul过滤器-IDEA版
  • LoginFilter代码:
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;

/**
 * 自定义过滤器
 */
@Component
public class LoginFilter extends ZuulFilter{

    /**
     * 过滤器的类型:pre route post error
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 执行顺序,返回值越小,优先级越高
     * @return
     */
    @Override
    public int filterOrder() {
        return 10;
    }

    /**
     * 是否执行run方法
     * true:执行run方法
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 编写过滤器的业务逻辑
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        //初始化context上下文对象,servlet spring
        RequestContext context = RequestContext.getCurrentContext();

        //获取request对象
        HttpServletRequest request = context.getRequest();
        //获取参数
        String token = request.getParameter("token");
        if(StringUtils.isBlank(token)){   //如果token为空
            //拦截
            context.setSendZuulResponse(false);
            //响应状态码,401身份未认证
            context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
            context.setResponseBody("request error!");
        }

        //返回值为null,代表该过滤器什么都不做
        return null;
    }
}

           

2.详解:

首先新建类之后继承ZuulFilter类,并重写如下四个方法:

  • (1)filterType方法
/**
     * 过滤器的类型:pre route post error
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }
           

return返回的值为该过滤器的类型:

  • pre类型:这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择请求的微服务,记录调试信息等。
  • routing类型:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netflix Ribbon请求微服务。
  • post类型:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP header、收集统计信息和指标、将响应从微服务发送给客户端等。
  • error类型:在其他阶段发送错误时执行该过滤器。
  • (2)filterOrder方法:
/**
     * 执行顺序,返回值越小,优先级越高
     * @return
     */
    @Override
    public int filterOrder() {
        return 10;
    }
           
  • (3)shouldFilter方法:

    是否执行run方法(true,false)。

@Override
    public boolean shouldFilter() {
        return true;
    }

           
  • (4) run方法:

    编写业务逻辑。

@Override
    public Object run() throws ZuulException {
        //初始化context上下文对象,servlet spring
        RequestContext context = RequestContext.getCurrentContext();

        //获取request对象
        HttpServletRequest request = context.getRequest();
        //获取参数
        String token = request.getParameter("token");
        if(StringUtils.isBlank(token)){   //如果token为空
            //拦截
            context.setSendZuulResponse(false);
            //响应状态码,401身份未认证
            context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
            context.setResponseBody("request error!");
        }

        //返回值为null,代表该过滤器什么都不做
        return null;
    }
           

3.测试代码:

  • 没有传token时:
    SpringCloud学习笔记13zuul过滤器-IDEA版
  • 传token时:
    SpringCloud学习笔记13zuul过滤器-IDEA版
    成功拉取服务。