6

我有一个应用程序连接到需要基本身份验证的站点。这些站点在运行时提供,并且在编译时不知道。HttpClient 4.2,基本身份验证和AuthScope

我正在使用HttpClient 4.2。

我不确定下面的代码是如何指定基本认证,但文档会建议它。但是,我不知道要在AuthScope的构造函数中传递什么。我曾认为一个空参数意味着所提供的凭据应该用于所有的URL,但它会抛出一个NullPointerException,所以很明显我错了。

m_client = new DefaultHttpClient(); 
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(m_userName, m_password); 
((DefaultHttpClient)m_client).getCredentialsProvider().setCredentials(new AuthScope((HttpHost)null), credentials); 
+0

client.getCredentialsProvider()。 setCredentials( )新的AuthScope(proxyHost,proxyPort), 新的UsernamePasswordCredentials(proxyUser,proxyPassword)); 这是正确的方法 – MayurB

回答

8

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); 
+1

谢谢基兰。我在客户端没有'getState'方法,但我想我们只是使用不同的版本。我按照你的建议尝试了AuthScope.ANY',它工作 - 谢谢。我可以问你另外一个问题吗 - setAuthenticationPreemptive(true)是否必要/推荐? – user265330

+1

花了我一段时间看到这个评论。 'setAuthenticationPreemptive(true)'意味着将在初始请求中发送crendentials,而不需要先尝试请求而没有凭证,然后获取401然后提供给他们一旦被挑战。 – Kieran

+2

此方法在HttpClient4.1中不可用 – MayurB

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