优惠券项目-过滤器基本用法

108 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情 zuul的过滤器根据对HTTP请求的不同处理阶段包括如下四种类型

  • pre :在请求转发到后端目标服务之前执行,一般用于请求认证、确定路由地址、日志记录等
  • route :转发请求,使用Apache HttpClient 或 Ribbon来构造对目标服务的请求
  • post :在目标服务返回结果后对结果进行处理,比如添加响应头、收集统计性能数据等
  • error :在请求处理的整个流程中如果出现错误,则会触发error过滤器执行,对错误进行处理 image.png

1.新增filter包

image.png

2.定义AbstractZuulFilter抽象类

package com.imooc.coupon.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

/**
 * @author ccuser
 */
public abstract class AbstractZuulFilter extends ZuulFilter {

    RequestContext context;

    private final static String NEXT = "next";

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        return (boolean) ctx.getOrDefault(NEXT,true);
    }

    @Override
    public Object run() throws ZuulException {
        context= RequestContext.getCurrentContext();
        return cRun();
    }
    protected abstract Object cRun();

    Object fail(int code ,String msg){
        context.set(NEXT,false);
        context.setSendZuulResponse(false);
        context.getResponse().setContentType("text/html;charset=UTF-8");
        context.setResponseStatusCode(code);
        context.setResponseBody(String.format("{"result":"%s"}",msg));
        return null;
    }
    Object success(){
        context.set(NEXT,true);
        return null;
    }
}

代码说明:

  • shouldFilter:表示该过滤器是否过滤逻辑,为true则执行run(),为false,则不执行。
  • Object run():过滤器实际上执行的内容(即具体的过滤逻辑)
  • protected abstract Object cRun(): 自定义过滤执行的逻辑
  • Object fail:错误返回方法
  • Object success: 成功返回方法

3.定义前置过滤器AbstractPreZuulFilter

public abstract class AbstractPreZuulFilter extends AbstractZuulFilter {
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }
}

代码说明:前置过滤器继承AbstractZuulFilter并且重写filterType方法

4.定义post过滤器AbstractPostZuulFilter

public abstract class AbstractPostZuulFilter extends AbstractZuulFilter {
    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;
    }
}

代码说明:post过滤器继承AbstractZuulFilter并且重写filterType方法

4.自定义token过滤器

@Slf4j
@Component
public class TokenFilter extends AbstractPreZuulFilter {
    @Override
    protected Object cRun() {
        HttpServletRequest request = context.getRequest();
        log.info(String.format("%s request to %s",request.getMethod(),request.getRequestURL().toString()));
        Object token = request.getParameter("token");
        if(null == token){
            log.error("error:token is empty");
            return fail(401,"error:token is empty");
        }
        return success();
    }

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

代码说明:

  • @Slf4j:注入日志依赖
  • @Component:过滤器定义为组件
  • Object cRun():过滤逻辑
  • HttpServletRequest request = context.getRequest():获取请求对象
  • Object token = request.getParameter("token"):获取token对象
  • null == token判断token是否为空,如果为空,直接返回错误信息
  • filterOrder:通过int值来定义过滤器的执行顺序,值越小,越早执行