Я использую Netflix Zuul v2.0 в качестве прокси-сервера аутентификации, т.е. я использую фильтр "pre" для добавления токена JWT в заголовок запроса.
Проблема, с которой я столкнулся, заключается в следующем: когда ресурс запроса недоступен, вместо ошибки «Время ожидания запроса» (408) возвращается «Внутренняя ошибка сервера» (500).Я решил эту проблему, внедрив пользовательский фильтр ошибок и возвращая ошибку 408 при возникновении ошибки.
Однако теперь я возвращаю ошибку «Время ожидания запроса» (408) для каждой ошибки.даже когда причина была другой.например, когда был «неверный запрос» или «несанкционированный» запрос.
Вопрос в том, как узнать в фильтре ошибок, какова реальная причина проблемы?например, я хочу вернуть 408, только когда действительно был тайм-аут.Afaik единственная информация, которая у меня есть, это то, что произошла ошибка, следовательно, ctx.getResponseStatusCode()
равно 500
.Или я что-то упустил?
Вот реализация пользовательского фильтра ошибок:
@Component
public class ConnectionErrorFilter extends ZuulFilter {
protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran";
@Override
public String filterType() {
return FilterConstants.ERROR_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.SEND_ERROR_FILTER_ORDER - 1; // Invoke before default error filter
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.set(SEND_ERROR_FILTER_RAN);
ctx.setResponseStatusCode(408); // Workaround because it is here IMO not detectable what the real cause was.
// Thus, we assume that the cloud was not reachable.
return null;
}
}