Несколько запросов Apache CXF WebClient с заголовком www-authenticate

У меня есть простой ресурс JAX-RS, и я использую Apache CXF WebClient в качестве клиента. Я использую базовую аутентификацию HTTP. При сбое на сервере отправляется типичный ответ 401 UNAUTHORIZED вместе с заголовком WWW-Authenticate.

Странное поведение происходит с WebClient при получении этого заголовка (WWW-Auhenticate). WebClient (внутренне) повторяет один и тот же запрос несколько раз (20 раз), а затем терпит неудачу.

WebClient webClient = WebClientFactory.newClient("http://myserver/auth");
try {
    webClient.get(SimpleResponse.class);
    // inside GET, 20 HTTP GET requests are invoked
} catch (ServerWebApplicationException ex) {
    // data are present when WWW-authenticate header is not sent from server
    // if header is present, unmarshalling fails
    AuthError err = ex.toErrorObject(webClient, AuthError.class);
}

person zdenda.online    schedule 23.05.2013    source источник


Ответы (2)


Это было исправлено в последних версиях CXF:

https://issues.apache.org/jira/browse/CXF-4815

person Daniel Kulp    schedule 23.05.2013
comment
Большое спасибо, Даниил. Я использую последний TomEE, у которого, к сожалению, более старые версии... Надеюсь, что ребята из TomEE скоро обновят библиотеки (я не могу этого сделать, потому что я поставляю только WAR, а не AS) - person zdenda.online; 26.05.2013

Я обнаружил ту же проблему в CXF 3.1.

В моем случае для всех асинхронных запросов http rest, если ответ пришел 401/407, то поток переходит в бесконечный цикл и печать WWW-Authenticate не устанавливается в ответ.

Что я проанализировал код, я обнаружил, что: В случае асинхронного вызова Поток управления из HttpConduit.handleRetransmits-> processRetransmit-> AsyncHTTPConduit.authorizationRetransmit, который возвращает true, а в HttpConduit код

int maxRetransmits = getMaxRetransmits(); updateCookiesBeforeRetransmit(); int nretransmits = 0; while ((maxRetransmits < 0 || nretransmits < maxRetransmits) && processRetransmit()) { nretransmits++; }

Если maxRetransmits = -1 и processRetransmit() возвращают true, тогда поток переходит в бесконечный цикл.

Поэтому, чтобы решить эту проблему, мы передаем maxRetransmitValue как 0 в HttpConduit.getClient().

Надеюсь, это будет другим.

person user2542339    schedule 03.08.2018