Ind*_*nde 0 spring spring-cloud netflix-zuul spring-cloud-netflix
我想添加一个自定义错误Zuul过滤器,并希望确保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;
}
Run Code Online (Sandbox Code Playgroud)
我有以下问题 -
将过滤器顺序设置为-1不禁止sendErrorFilter运行.
要停止运行sendErrorFilter,我需要设置
zuul.SendErrorFilter.error.disable=true在bootstrap.yml
为了得到这是在自定义错误设置过滤器的响应身体,我需要设置throwable到null如提及github上.
将过滤器设置为"错误"类型不会执行任何操作,并且自定义文件管理器不会运行.
我希望有人解释,我做错了什么以及处理自定义错误过滤器的最正确方法是什么,因为网上有很多可用的冲突信息.
Dependencies-
春云 - Edgware.RELEASE
spring cloud netflix starter zuul- 1.4.3.RELEASE
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)输入你CustomErrorFilter的filterOrder()as为-1,你CustomErrorFilter将首先执行,我们将RequestContextwith 设置SEND_ERROR_FILTER_RAN为true.现在当它shouldFilter()的SendErrorFilter求值方法为false而且它不会执行run()方法SendErrorFilter.
| 归档时间: |
|
| 查看次数: |
3212 次 |
| 最近记录: |