根据条件阻止Filter链执行

时间:2017-01-16 14:56:23

标签: spring spring-boot netflix-zuul

在我的春季启动应用程序中,我有以下过滤器注册表:

public class Filter1 extends ZuulFilter {
    public boolean shouldFilter() {
            if(condition){
            return false;
            }
            return true
    }

}

public class Filter2 extends ZuulFilter {
    public boolean shouldFilter() {
            if(condition){
            return false;
            }
            return true
    }

}

在第一个过滤器中我需要检查一个条件,如果这个条件为真,我想跳过我的过滤器注册表中的所有过滤器。我现在所拥有的是我在每个过滤器的开头进行检查,如下所示:

{{1}}

但我真正想要的是创建一个保存条件的新过滤器,在开头运行条件过滤器,如果条件为true,则不要在过滤器注册表执行中继续。

任何想法?

1 个答案:

答案 0 :(得分:1)

这可以通过在决策过滤器中添加请求属性来逻辑实现。

决策过滤器应如下所示。

public class DecisionFilter extends ZuulFilter {

    // .... Other methods and codes

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

        if(shouldExecuteFilter1()) {
            request.setAttribute("executeFilter1", true);
        } 

        if (shouldExecuteFilter2()) {
            request.setAttribute("executeFilter2", true);
        }
    }
}

现在,操作过滤器将从请求中获取相应的属性,如果为真,则执行操作。

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

        if (servletRequest.getAttribute("executeFilter1") != null || ((Boolean) servletRequest.getAttribute("executeFilter1"))) {
            // Perform your task
        }
    }
}

类似地,您可以使用一个首先运行的决策过滤器来实现任意数量的过滤器。