【问题标题】:Prevent Filter chain from execution based on condition根据条件阻止过滤器链执行
【发布时间】:2017-01-16 14:56:22
【问题描述】:

在我的 Spring Boot 应用程序中,我有以下过滤器注册表:

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

}

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

有什么想法吗?

【问题讨论】:

    标签: spring spring-boot netflix-zuul


    【解决方案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
            }
        }
    }
    

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

    【讨论】:

    • 这肯定会工作,感谢您的回答。但是我一直在寻找一个实际上不会向现有过滤器添加任何条件的答案
    • 在不更改过滤器本身代码的情况下实现过滤器的这种条件执行是不可能的,因为它需要在运行时检查数据并且您无法在运行时更新过滤器注册表。
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2021-06-03
    • 2015-01-21
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多