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. 将过滤器顺序设置为 -1 不会禁止 sendErrorFilter 来自 运行ning。

  2. 要停止来自 运行ning 的 sendErrorFilter,我需要设置 zuul.SendErrorFilter.error.disable=truebootstrap.yml

  3. 要获取在自定义错误过滤器中设置的响应正文,我需要将 throwable 设置为 null,如 github 中所述。

  4. 将过滤器设置为类型 "error" 什么都不做,自定义文件管理器不会 运行.

我希望有人能解释一下,我做错了什么以及处理自定义错误过滤器的最正确方法是什么,因为网上有很多相互矛盾的信息。

依赖项-

  1. spring云-Edgware.RELEASE

  2. spring cloud netflix starter zuul- 1.4.3.RELEASE

filtertype() 应该 return "error" 如果你想处理错误场景

filterOrder() 应该是 -1SendErrorFilter

之前执行

将以下行添加到您的过滤器 (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


更新:

检查 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) 这将计算为真,并且 SendErrorFilterrun() 方法将执行。

如果你把 ctx.set(SEND_ERROR_FILTER_RAN) 放在你的 CustomErrorFilter 中并且 filterOrder() 为 -1,你的 CustomErrorFilter 将首先执行,我们将 RequestContext 设置为SEND_ERROR_FILTER_RAN 为真。现在,当它转到 SendErrorFiltershouldFilter() 方法时,计算结果为 false 并且它不会执行 SendErrorFilterrun() 方法。