Я использую Spring Cloud Gateway Greenwich.SR1 с Spring Boot 2.1.5.Я пытаюсь создать шлюз для моих последующих сервисов.Часть работы шлюза - предоставить глобальную страницу ошибок для последующих запросов.Когда нисходящий сервис возвращает ответ HTTP 403, я хочу, чтобы шлюз предоставил подходящую страницу ошибки.
В настоящее время я использую пользовательский фильтр, подобный этому
public class ForbiddenFilterFactory extends AbstractGatewayFilterFactory<Object> {
@Override
public String name() {
return "Forbidden";
}
@Override
public GatewayFilter apply(Object o) {
return (exchange, chain) -> chain.filter(exchange).then(
Mono.defer(() -> {
if (!exchange.getResponse().isCommitted() &&
HttpStatus.FORBIDDEN.equals(exchange.getResponse().getStatusCode())) {
return Mono.error(new ResponseStatusException(HttpStatus.FORBIDDEN));
}
return Mono.empty();
}));
}
}
У меня также есть файл 403.html
в настройке src/main/resources/templates/error/
.
Проблема в том, чтоШлюз возвращает ответ 403 с пустым телом вместо содержимого HTML-файла.Во время отладки я вижу, что DefaultErrorWebExceptionHandler
создает правильное тело в форме Mono<ServerResponse>
, но фактический ответ никогда не записывается.
Есть ли другой способ заставить это работать?