SpringCLoud | Zuul(2)-请求过滤

270 阅读1分钟

1. Zuul请求过滤

Zuul允许用户在网关上自定义过滤器实现对请求的拦截和过滤,只需要继承抽象类ZuulFilter并实现4个方法即可。

1.1 过滤器类型与生命周期

过滤器类型 说明
pre 在请求被路由(转发)前调用
route 在请求被路由(转发)时调用
post 请求被路由(转发)后调用
error 网关发生异时调用

1.2 Zuul请求过滤实现

  1. 在路由转发的基础上实现
  2. 新建com.xyz.microservice.filter.MyFilter自定义过滤器
@Component
@Log4j2
public class MyFilter extends ZuulFilter {

    /**
     * 指定过滤器的类型,可以是pre/route/post/error
     * @return String
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     *  指定过滤器的优先级,数据越小,优先级越高
     * @return int
     */
    @Override
    public int filterOrder() {
        return 0;
    }


    /**
     *  判断是否开启此过滤器,true-是,false-否
     * @return boolean
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }


    /**
     * 过滤器的具体逻辑
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
        Object accessToken = request.getParameter("accessToken");
        if( accessToken == null) {
            log.warn("access token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            return null;
        }
        log.info("access token ok");
        return null;
    }
}
  1. 验证
  • 访问http://localhost:6001/xyz/mydept/provider/list?accessToken=100 返回401错误
  • 访问http://localhost:6001/xyz/mydept/provider/list 日志显示OK,成功访问到对应的微服务

代码示例-github

参考