根据条件防止过滤器链执行
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
}
}
}
同样,您可以使用一个首先运行的决策过滤器来实施任意数量的过滤器。
在我的 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
}
}
}
同样,您可以使用一个首先运行的决策过滤器来实施任意数量的过滤器。