Spring Cloud Gateway过滤器精确控制异常返回(分析篇)
@Component
public class GatewayErrorFilterFactory extends AbstractGatewayFilterFactory<GatewayErrorFilterFactory.Config> {
// 注入日志工具
private static final Logger LOGGER = LoggerFactory.com.example.demo.GatewayErrorFilterFactory;
public GatewayErrorFilterFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("statuses");
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) ->
chain.filter(exchange).onErrorResume(throwable -> {
ServerHttpResponse response = exchange.getResponse();
// 检查是否为指定的状态码
if (config.getStatuses().contains(response.getStatusCode())) {
// 记录日志
LOGGER.error("Error during filtering: ", throwable);
// 返回自定义响应
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return response.writeWith(
Mono.fromSupplier(() -> {
DataBufferFactory bufferFactory = response.bufferFactory();
return bufferFactory.wrap("{\"message\":\"系统异常,请联系管理员\"}".getBytes(StandardCharsets.UTF_8));
})
);
}
// 如果不是指定状态码,则不处理
return Mono.error(throwable);
});
}
public static class Config {
private Set<HttpStatus> statuses = new HashSet<>();
public Set<HttpStatus> getStatuses() {
return statuses;
}
public void setStatuses(Set<HttpStatus> statuses) {
this.statuses = statuses;
}
}
}
这个代码实例展示了如何在Spring Cloud Gateway中创建一个自定义的错误过滤器工厂,用于在特定的HTTP状态码发生错误时,返回一个友好的错误信息。这个例子中,我们定义了一个名为GatewayErrorFilterFactory
的类,它扩展了AbstractGatewayFilterFactory
并实现了一个配置类Config
。在apply
方法中,我们定义了当特定状态码出现错误时,记录日志并返回一个自定义的JSON响应的逻辑。这个例子有助于教育开发者如何在Spring Cloud Gateway中精确控制异常返回的行为。
评论已关闭