【问题标题】:Spring Cloud Zuul - Custom Error FilterSpring Cloud Zuul - 自定义错误过滤器
【发布时间】:2018-08-06 15:09:47
【问题描述】:

我想添加一个自定义错误 Zuul 过滤器,并希望确保 SendErrorFilter 不会执行。我查看了一些 github 链接,包括 Spring-cloud/spring-cloud-netflix 和各种 stack-overflow 问题:-

Customizing Zuul Exception

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

  2. 要停止 sendErrorFilter 运行,我需要设置 zuul.SendErrorFilter.error.disable=true in bootstrap.yml

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

  4. 将过滤器设置为 "error" 类型不会执行任何操作,并且自定义过滤器不会运行。

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

依赖关系-

  1. spring cloud - Edgware.RELEASE

  2. spring cloud netflix starter zuul-1.4.3.RELEASE

【问题讨论】:

    标签: spring spring-cloud spring-cloud-netflix netflix-zuul


    【解决方案1】:

    如果你想处理错误场景,filtertype() 应该返回"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) 这将评估为 true,并且将执行 SendErrorFilterrun() 方法。

    如果您将ctx.set(SEND_ERROR_FILTER_RAN) 放入您的CustomErrorFilter 并将filterOrder() 设置为-1,您的CustomErrorFilter 将首先执行,我们将RequestContextSEND_ERROR_FILTER_RAN 设置为true。现在,当它转到 SendErrorFiltershouldFilter() 方法时,评估为 false 并且它不会执行 SendErrorFilterrun() 方法。

    【讨论】:

    • 这是否会使过滤器在 sendError 过滤器之前执行,以及使 sendError 过滤器不执行的正确方法是什么?
    • 您能否介绍一下发生错误时幕后发生的情况,以及为什么您建议的修复工作有效?
    猜你喜欢
    • 2023-03-04
    • 2016-05-27
    • 2015-04-12
    • 2016-07-11
    • 2020-04-15
    • 2018-08-23
    • 1970-01-01
    • 2015-01-18
    • 2015-09-12
    相关资源
    最近更新 更多