根据条件防止过滤器链执行

Prevent Filter chain from execution based on condition

在我的 spring 引导应用程序中,我有以下过滤器注册表:

@Bean
public FilterRegistry filterRegistry(Service1 service1, Service2 service2,
            EvictionService evictionService) throws GeneralSecurityException {
      FilterRegistry r = FilterRegistry.instance();

      r.put("filter1", new MetadataFilter(Service2,evictionService));
      r.put("filter2", new RoutesFilter(service1,evictionService, publicKey));

      return r;
}

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

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
    }

}

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

有什么想法吗?

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

决策过滤器应如下所示。

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
        }
    }
}

同样,您可以使用一个首先运行的决策过滤器来实施任意数量的过滤器。