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

Ind*_*nde 0 spring spring-cloud netflix-zuul spring-cloud-netflix

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

自定义Zuul异常

覆盖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;
}
Run Code Online (Sandbox Code Playgroud)

我有以下问题 -

  1. 将过滤器顺序设置为-1不禁止sendErrorFilter运行.

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

  3. 为了得到这是在自定义错误设置过滤器的响应身体,我需要设置throwablenull如提及github上.

  4. 将过滤器设置为"错误"类型不会执行任何操作,并且自定义文件管理器不会运行.

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

Dependencies-

  1. 春云 - Edgware.RELEASE

  2. spring cloud netflix starter zuul- 1.4.3.RELEASE

Pav*_*ala 8

filtertype()"error"如果要处理错误情况,应该返回

filterOrder()应该先-1执行SendErrorFilter

将以下行添加到过滤器(CustomErrorFilter)

protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran";
Run Code Online (Sandbox Code Playgroud)

@Override
public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    ctx.set(SEND_ERROR_FILTER_RAN);
    // rest of your code
    return null;
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

对于每个请求RequestContext都会创建,但spring不在SEND_ERROR_FILTER_RAN上下文中设置.可能是旧版本,您必须从yaml file(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)输入你CustomErrorFilterfilterOrder()as为-1,你CustomErrorFilter将首先执行,我们将RequestContextwith 设置SEND_ERROR_FILTER_RAN为true.现在当它shouldFilter()SendErrorFilter求值方法为false而且它不会执行run()方法SendErrorFilter.