5Zuul 过滤器 · SpringCloud微服务实战 · 看云

5. Zuul 过滤器

导航

本节代码地址


Zuul作为网关来说,会做很多转发前的校验,而这些校验我们都可以基于Zuul过滤器来实现,比如Token校验、IP黑名单等。

5.1 新建过滤器

通过模拟用户必须携带token,来拦截用户的请求。前面我们说过Zuul 的生命周期,我们这里模拟在Header里面需要携带token,并且token 的值必须为123456,否则就会执行失败。


public class TokenFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre"; 
    }

    @Override
    public int filterOrder() {
        return 0; 
    }

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

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        String token = request.getHeader("token");

        
        if (StringUtils.isNotBlank(token) && token.equals("123456")) {
            ctx.setSendZuulResponse(true); 
            ctx.setResponseStatusCode(200);
            ctx.set("code", 1);
        } else {
            ctx.setSendZuulResponse(false); 
            ctx.setResponseStatusCode(401);
            HttpServletResponse response = ctx.getResponse();
            response.setHeader("content-type", "text/html;charset=utf8");
            ctx.setResponseBody("认证失败");
            ctx.set("code", 0);
        }
        return null;
    }
}

自定义过滤器需要继承ZuulFilter , 并且需要实现下面几个方法:
• shou ldFilter : 是否执行该过滤器, true 为执行, false 为不执行,可以结合配置中心及结合业务逻辑设置
• filterType :过滤器类型,pre 、route 、post 、error 。
• filterOrder :过滤器的执行顺序,数值越小,优先级越高。
• run :执行自己的业务逻辑。设置的ctx.setSendZuulResponse(false); 代表不对其进行路由,ctx.setSendZuulResponse(true);表示对请求进行路由。

5.3 配置过滤器

@Configuration
public class ZuulConfig {
    
    @Bean
    public TokenFilter tokenFilter(){
        return new TokenFilter();
    }
}

5.4 重启应用

浏览器或Postman 输入localhost:8679/ribbon/user/1
首先未设置token
485a01bf8d31b0c68306371b7f7c4dc5_MD5.png

设置token
fa49e6e82c34c91604cc1e60763cd994_MD5.png