我想添加一个自定义错误Zuul过滤器,并希望确保SendErrorFilter不执行。我看了几个github链接,包括Spring-cloud/spring-cloud-netflix和各种堆栈溢出问题: -
Overriding Zuul Filter SendErrorFilter
我的代码如下 -
public class CustomErrorFilter extends ZuulFilter {
private static final Logger LOG = LoggerFactory.getLogger(CustomErrorFilter.class);
@Override
public String filterType() {
return "post";
}
@Override
public int filterOrder() {
return -1;
}
@Override
public boolean shouldFilter() {
RequestContext ctx=RequestContext.getCurrentContext();
if(ctx.getThrowable()!=null)
return true;
else
return false;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.setThrowable(null); // response is not returned unless
throwable is set to null.
ctx.remove("error.status_code");
ctx.setResponseBody(“Error”);
ctx.getResponse().setContentType("text/plain");
ctx.setResponseStatusCode(400);
}
return null;
}
我有以下问题 -
-1
不会禁止sendErrorFilter
运行。zuul.SendErrorFilter.error.disable=true
中设置bootstrap.yml
throwable
设置为null
中提到的github。我希望有人解释,我做错了什么以及处理自定义错误过滤器的最正确方法是什么,因为网上有很多可用的冲突信息。
Dependencies-
如果你想处理错误场景,filtertype()
应该返回"error"
filterOrder()
应该是-1
在SendErrorFilter
之前执行
将以下行添加到过滤器(CustomErrorFilter)
protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran";
和
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.set(SEND_ERROR_FILTER_RAN);
// rest of your code
return null;
}
ctx.set(SEND_ERROR_FILTER_RAN);
将阻止SendErrorFilter
逃跑。
更新:
检查shouldFilter()
中的SendErrorFilter方法
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
// only forward to errorPath if it hasn't been forwarded to already
return ctx.getThrowable() != null
&& !ctx.getBoolean(SEND_ERROR_FILTER_RAN, false);
}
对于每个请求,RequestContext
都会被创建,但spring并没有在上下文中设置SEND_ERROR_FILTER_RAN
。可能是旧版本,你必须从yaml文件(zuul.SendErrorFilter.error.disable=true
)配置更新版本(1.4.3.RELEASE
)从ctx.set(SEND_ERROR_FILTER_RAN)
代码。
默认情况下,!ctx.getBoolean(SEND_ERROR_FILTER_RAN, false)
将评估为true,run()
的SendErrorFilter
方法将执行。
如果你把ctx.set(SEND_ERROR_FILTER_RAN)
放在你的CustomErrorFilter
中,filterOrder()
为-1,你的CustomErrorFilter
将首先执行,我们将RequestContext
设置为SEND_ERROR_FILTER_RAN
为真。现在,当shouldFilter()
SendErrorFilter
评估为false时,它将不会执行run()
的SendErrorFilter
方法。