Spring Cloud Zuul - 自定义错误过滤器

问题描述 投票:0回答:1

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

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中设置bootstrap.yml
  3. 要获得在自定义错误过滤器中设置的响应主体,我需要将throwable设置为null中提到的github
  4. 将过滤器设置为“错误”类型不会执行任何操作,并且自定义文件管理器不会运行。

我希望有人解释,我做错了什么以及处理自定义错误过滤器的最正确方法是什么,因为网上有很多可用的冲突信息。

Dependencies-

  1. 春云 - Edgware.RELEASE
  2. spring cloud netflix starter zuul- 1.4.3.RELEASE
spring spring-cloud spring-cloud-netflix netflix-zuul
1个回答
6
投票

如果你想处理错误场景,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逃跑。


更新:

检查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方法。

© www.soinside.com 2019 - 2024. All rights reserved.