欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Zuul【自定义Filter】

程序员文章站 2022-05-03 22:15:44
实际业务中,如果要自定义filter过滤器,只需集成ZuulFIlter类即可,该类是个抽象类,它实现了IZuulFIlter接口,我们需要实现几个方法,如下示例: ......

实际业务中,如果要自定义filter过滤器,只需集成zuulfilter类即可,该类是个抽象类,它实现了izuulfilter接口,我们需要实现几个方法,如下示例:

import static org.springframework.cloud.netflix.zuul.filters.support.filterconstants.pre_type;

import javax.servlet.http.httpservletrequest;

import com.netflix.zuul.zuulfilter;
import com.netflix.zuul.context.requestcontext;
import com.netflix.zuul.exception.zuulexception;

public class thirdprefilter extends zuulfilter { /** * 设置filter的类型,支持4种类型 * {@link org.springframework.cloud.netflix.zuul.filters.support.filterconstants} * <pre> * error_type = "error";//这种过滤器是在整个生命周期内,如果发生异常,就执行该filter,可以做全局异常处理。 * post_type = "post";//这种过滤器是在端点请求完毕,返回结果或者发生异常后执行的filter。如果需要对返回的结果进行再次处理,可以在这种过滤中处理逻辑。 * pre_type = "pre"; //在zuul网关按照规则路由到下级服务之前执行,如果需要对请求进行预处理,可以使用这种类型的过滤器。如:认证鉴权,限流等。 * route_type = "route";//这种过滤器是zuul路由动作的执行者,是apache httpclient或ribbon构建和发送原始http请求的地方,现在也支持okhttp。 * </pre> * * @return */ @override public string filtertype() { return pre_type; } /** * 设置filter的执行顺序,数字越小,优先级越高,反之越低 * * @return */ @override public int filterorder() { return 3; } /** * 是否执行该过滤器,可以作为一个开关,如果一直都被执行,直接返回true即可 * * @return */ @override public boolean shouldfilter() { requestcontext ctx = requestcontext.getcurrentcontext(); //从上下文获取logic-is-success值,用于判断此filter是否执行 return (boolean) ctx.get("logic-is-success"); } /** * 该自定义filter的业务逻辑 * * @return * @throws zuulexception */ @override public object run() throws zuulexception { system.out.println("这是thirdprefilter!"); //从requestcontext获取上下文 requestcontext ctx = requestcontext.getcurrentcontext(); //从上下文获取httpservletrequest httpservletrequest request = ctx.getrequest(); //从request尝试获取b参数值 string b = request.getparameter("b"); //如果b参数值为空则进入此逻辑 if (null == b) { //对该请求禁止路由,也就是禁止访问下游服务 ctx.setsendzuulresponse(false); //设定responsebody供postfilter使用 ctx.setresponsebody("{\"status\":500,\"message\":\"b参数为空!\"}"); //logic-is-success保存于上下文,作为同类型下游filter的执行开关,假定后续还有自定义filter当设置此值 ctx.set("logic-is-success", false); //到这里此filter逻辑结束 return null; } //设置避免报空指针异常 ctx.set("logic-is-success", true); return null; } }
import com.netflix.zuul.zuulfilter;
import com.netflix.zuul.context.requestcontext;
import com.netflix.zuul.exception.zuulexception;

import static org.springframework.cloud.netflix.zuul.filters.support.filterconstants.*;

public class postfilter extends zuulfilter {
    
    @override
    public string filtertype() {
        return post_type;
    }
    
    @override
    public int filterorder() {
        return 0;
    }

    @override
    public boolean shouldfilter() {
        return true;
    }

    @override
    public object run() throws zuulexception {
        system.out.println("这是postfilter!");
        //从requestcontext获取上下文
        requestcontext ctx = requestcontext.getcurrentcontext();
        //处理返回中文乱码
        ctx.getresponse().setcharacterencoding("utf-8");
        //获取上下文中保存的responsebody
        string responsebody = ctx.getresponsebody();
        //如果responsebody不为空,则说明流程有异常发生
        if (null != responsebody) {
            //设定返回状态码
            ctx.setresponsestatuscode(500);
            //替换响应报文
            ctx.setresponsebody(responsebody);
        }
        return null;
    }
}