我遇到了这段代码,我正在尝试重构已弃用的DefaultHttpClient
用法以使用HttpClientBuilder
并尝试复制身份验证部分。
在 HttpClientBuilder 世界中,我可以使用抢占式 (HttpClientContext.create().setAuthCache(new BasicAuthCache())
) 或不使用 - 将凭据提供程序直接设置为构建器 (httpClientBuilder.setDefaultCredentialsProvider(new BasicCredentialsProvider())
)
在这里,我没有看到以任何方式指定这一点,所以我通过 httpclient 库进行了调试,但无法确定得出结论。你能告诉我,下面的代码是在进行抢占式还是非抢占式身份验证吗? (由于我必须重构较旧的http客户端3.x代码,因此它非常富有表现力,因为有.setAuthenticationPreemptive
方法,它清楚地告诉我它是什么)
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpParams;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.auth.params.AuthParams;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
...
DefaultHttpClient client = new DefaultHttpClient(new BasicHttpParams());
HttpParams params = client.getParams();
AuthParams.setCredentialCharset(params, "UTF-8");
client.getCredentialsProvider()
.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("login","passwd"));
...
client.execute(new HttpGet("uri"));
谢谢!
看起来简单的答案是:上面是一个非抢占式身份验证的示例。
为什么?因为设置抢占式拦截器的唯一位置是在处理org.apache.http.client.protocol.RequestAuthCache
拦截器期间,它查找设置AuthCache
,在上述情况下未设置。