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