在我的春季启动应用程序中,我有以下过滤器注册表:
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,则不要在过滤器注册表执行中继续。
任何想法?
答案 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
}
}
}
类似地,您可以使用一个首先运行的决策过滤器来实现任意数量的过滤器。