Http Apache CXF WebClient具有www-authenticate头的多个请求

Http Apache CXF WebClient具有www-authenticate头的多个请求,http,cxf,jax-rs,cxfrs,Http,Cxf,Jax Rs,Cxfrs,我得到了简单的JAX-RS资源,并使用ApacheCxfWebClient作为客户端。我正在使用HTTP基本身份验证。当它在服务器上出现故障时,典型的401未经授权响应将与WWW Authenticate头一起发送 当收到此(WWW Auhenticate)头时,WebClient会发生奇怪的行为。WebClient(内部)将同一请求重复多次(20次),然后失败 WebClient webClient = WebClientFactory.newClient("http://myserver/a

我得到了简单的JAX-RS资源,并使用ApacheCxfWebClient作为客户端。我正在使用HTTP基本身份验证。当它在服务器上出现故障时,典型的401未经授权响应将与WWW Authenticate头一起发送

当收到此(WWW Auhenticate)头时,WebClient会发生奇怪的行为。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);
}

在最新版本的CXF中已修复此问题:


我在CXF 3.1中发现了相同的问题

在我的例子中,对于所有异步http rest请求,如果响应来自401/407,那么线程将进入无限循环,并且在响应中未设置打印WWW Authenticate

我分析代码时发现: 如果异步调用控制流来自
httpconductor.handleretransms->processRetransmit->asynchtpconductor.authorizationRetransmit
返回true,在httpconductor中代码为

int-maxRetransmits=getMaxRetransmits();
updateCookiesBeforeRetransmit();
int=0;
while((maxretransmit<0 | | nretransmit

如果
maxRetransmits=-1
processRetransmit()
返回true,则线程进入无限循环

因此,为了克服这个问题,我们在
httpconductor.getClient()
中将maxRetransmitValue传递为0


希望其他人也能这样。

非常感谢丹尼尔。我在看最新的一本书,遗憾的是它有更旧的版本。。。希望TomEE的家伙们能尽快加入libs(我不能这么做,因为我只提供战争,而不是战争)