HttpClient 4.2、基本身份验证和 AuthScope
Posted
技术标签:
【中文标题】HttpClient 4.2、基本身份验证和 AuthScope【英文标题】:HttpClient 4.2, Basic Authentication, and AuthScope 【发布时间】:2012-06-01 12:18:46 【问题描述】:我有一个应用程序连接到需要基本身份验证的网站。这些站点是在运行时提供的,在编译时是未知的。
我正在使用 HttpClient 4.2。
我不确定下面的代码是否是我应该指定基本身份验证的方式,但文档会建议这样做。但是,我不知道在AuthScope
的构造函数中传递什么。我原以为 null 参数意味着提供的凭据应该用于所有 URL,但它会抛出 NullPointerException
,所以很明显我错了。
m_client = new DefaultHttpClient();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(m_userName, m_password);
((DefaultHttpClient)m_client).getCredentialsProvider().setCredentials(new AuthScope((HttpHost)null), credentials);
【问题讨论】:
client.getCredentialsProvider()。 setCredentials(new AuthScope(proxyHost, proxyPort), new UsernamePasswordCredentials(proxyUser, proxyPassword));这是正确的方法 【参考方案1】:AuthScope.ANY 是您所追求的:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/AuthScope.html
试试这个:
final HttpClient client = new HttpClient();
client.getParams().setAuthenticationPreemptive(true);
client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user.getUsername(), user.getPassword()));
final GetMethod method = new GetMethod(uri);
client.executeMethod(method);
【讨论】:
谢谢基兰。我在客户端上没有getState
方法,但我想我们只是使用不同的版本。我按照您的建议尝试了AuthScope.ANY
,它奏效了-谢谢。我可以再问你一个问题吗?setAuthenticationPreemptive(true)
是必要的/推荐的吗?
我花了一段时间才看到这条评论。 setAuthenticationPreemptive(true)
表示凭据将在初始请求中发送,而无需首先尝试没有凭据的请求,然后获得 401,然后在受到挑战时提供它们。
HttpClient4.1没有这个方法【参考方案2】:
至少从 4.2.3 版开始(我猜是在 3.X 版之后),接受的答案不再有效。相反,请执行以下操作:
private HttpClient createClient()
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setContentCharset(params, "UTF-8");
Credentials credentials = new UsernamePasswordCredentials("user", "password");
DefaultHttpClient httpclient = new DefaultHttpClient(params);
httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials);
return httpclient;
AuthScope.ANY
的 JavaDoc 说 在未来的 HttpClient 版本中将停止使用此参数,因此使用它需要您自担风险。更好的选择是使用AuthScope
中定义的构造函数之一。
有关如何使请求抢占式的讨论,请参阅:
Preemptive Basic authentication with Apache HttpClient 4
【讨论】:
以上是关于HttpClient 4.2、基本身份验证和 AuthScope的主要内容,如果未能解决你的问题,请参考以下文章
csharp 使用基本身份验证和代理的简单C#.NET 4.5 HTTPClient请求
使用 HttpClient 在 Java 中进行 Http 基本身份验证?
Angular 6 - httpClient 在 httpOptions 中传递基本身份验证
使用 Java 和 apache HttpClient 的 Apache Shiro authcBasic 身份验证