Spring Cloud Zuul - 自定义错误过滤器
Spring Cloud Zuul - Custom Error Filter
我想添加自定义错误 Zuul Filter 并想确保 SendErrorFilter 不执行。我查看了几个 github 链接,包括 Spring-cloud/spring-cloud-netflix 和各种 堆栈溢出问题 :-
我的代码如下-
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
来自 运行ning。
要停止来自 运行ning 的 sendErrorFilter,我需要设置
zuul.SendErrorFilter.error.disable=true
在 bootstrap.yml
要获取在自定义错误过滤器中设置的响应正文,我需要将 throwable
设置为 null
,如 github 中所述。
将过滤器设置为类型 "error" 什么都不做,自定义文件管理器不会 运行.
我希望有人能解释一下,我做错了什么以及处理自定义错误过滤器的最正确方法是什么,因为网上有很多相互矛盾的信息。
依赖项-
spring云-Edgware.RELEASE
spring cloud netflix starter zuul- 1.4.3.RELEASE
filtertype()
应该 return "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()
方法
@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)
这将计算为真,并且 SendErrorFilter
的 run()
方法将执行。
如果你把 ctx.set(SEND_ERROR_FILTER_RAN)
放在你的 CustomErrorFilter
中并且 filterOrder()
为 -1,你的 CustomErrorFilter
将首先执行,我们将 RequestContext
设置为SEND_ERROR_FILTER_RAN
为真。现在,当它转到 SendErrorFilter
的 shouldFilter()
方法时,计算结果为 false 并且它不会执行 SendErrorFilter
的 run()
方法。
我想添加自定义错误 Zuul Filter 并想确保 SendErrorFilter 不执行。我查看了几个 github 链接,包括 Spring-cloud/spring-cloud-netflix 和各种 堆栈溢出问题 :-
我的代码如下-
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
来自 运行ning。要停止来自 运行ning 的 sendErrorFilter,我需要设置
zuul.SendErrorFilter.error.disable=true
在bootstrap.yml
要获取在自定义错误过滤器中设置的响应正文,我需要将
throwable
设置为null
,如 github 中所述。将过滤器设置为类型 "error" 什么都不做,自定义文件管理器不会 运行.
我希望有人能解释一下,我做错了什么以及处理自定义错误过滤器的最正确方法是什么,因为网上有很多相互矛盾的信息。
依赖项-
spring云-Edgware.RELEASE
spring cloud netflix starter zuul- 1.4.3.RELEASE
filtertype()
应该 return "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()
方法
@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)
这将计算为真,并且 SendErrorFilter
的 run()
方法将执行。
如果你把 ctx.set(SEND_ERROR_FILTER_RAN)
放在你的 CustomErrorFilter
中并且 filterOrder()
为 -1,你的 CustomErrorFilter
将首先执行,我们将 RequestContext
设置为SEND_ERROR_FILTER_RAN
为真。现在,当它转到 SendErrorFilter
的 shouldFilter()
方法时,计算结果为 false 并且它不会执行 SendErrorFilter
的 run()
方法。