Spring Cloud Zuul - 自定义错误过滤器
Posted
技术标签:
【中文标题】Spring Cloud Zuul - 自定义错误过滤器【英文标题】:Spring Cloud Zuul - Custom Error Filter 【发布时间】: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
不会禁止sendErrorFilter
运行。
要停止 sendErrorFilter 运行,我需要设置
zuul.SendErrorFilter.error.disable=true
in bootstrap.yml
要获得在自定义错误过滤器中设置的响应正文,我需要将throwable
设置为null
,如github 中所述。
将过滤器设置为 "error" 类型不会执行任何操作,并且自定义过滤器不会运行。
我希望有人解释一下,我做错了什么以及处理自定义错误过滤器的最正确方法是什么,因为网络上有很多相互矛盾的信息。
依赖关系-
spring cloud - Edgware.RELEASE
spring cloud netflix starter zuul-1.4.3.RELEASE
【问题讨论】:
【参考方案1】:如果你想处理错误场景,filtertype()
应该返回"error"
filterOrder()
应该是-1
在SendErrorFilter
之前执行
将以下行添加到您的过滤器(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,并且将执行 SendErrorFilter
的 run()
方法。
如果您将ctx.set(SEND_ERROR_FILTER_RAN)
放入您的CustomErrorFilter
并将filterOrder()
设置为-1,您的CustomErrorFilter
将首先执行,我们将RequestContext
和SEND_ERROR_FILTER_RAN
设置为true。现在,当它转到 SendErrorFilter
的 shouldFilter()
方法时,评估为 false 并且它不会执行 SendErrorFilter
的 run()
方法。
【讨论】:
这是否会使过滤器在 sendError 过滤器之前执行,以及使 sendError 过滤器不执行的正确方法是什么? 您能否介绍一下发生错误时幕后发生的情况,以及为什么您建议的修复工作有效?以上是关于Spring Cloud Zuul - 自定义错误过滤器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Cloud 中创建自定义 zuul 过滤器
spring-cloud中zuul自定义service级别,api级别的路由白名单
Spring Cloud(Dalston.SR5)--Zuul 网关-过滤器
7Spring -Cloud-路由网管Spring Cloud Zuul
跟我学Spring Cloud(Finchley版)-17-Zuul路由配置详解
最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)