0

我正在使用Apache HttpClient庫連接到url。我在做的網絡有一個安全的代理。當我使用java.net包連接到URL我只需要添加HttpClient 4的代理設置不起作用

System.setProperty("http.proxyHost", proxy); 
System.setProperty("http.proxyPort", proxyPort); 

無代理的用戶ID和需要密碼才能通過,但是當我試圖通過HttpClient的連接我得到407 代理驗證錯誤。我的代碼是:

HttpHost proxy = new HttpHost("xyz.abc.com",8080,"http"); 
HttpClient httpclient = new DefaultHttpClient(); 
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy); 

代理是使用NTML authentication.I不想通過用戶名和密碼。

+0

最近的答案我覺得是計算器: http://stackoverflow.com/questions/6962047/apache-httpclient -4-1-proxy-authentication 我只是認爲你的Windows系統的NTLM證書不能從你的java層訪問,然後你需要重新認證到代理。我可能錯了。 –

+0

首先,我認爲HttpClient中沒有NTML支持,其次,憑證更改頻率很高,所以我不能以這種方式使用。如果它可用於java.net包URLConnect,則可以通過java層訪問我的Windows系統的憑證,以便它也可以用於httpclient庫。 –

回答

1

我已升級到httpclient 4.2並且此版本具有開箱即用的NTML支持。只需要下面幾行添加到代碼

HttpClient httpclient = new DefaultHttpClient(); 
NTCredentials creds = new NTCredentials("user", "pwd", "myworkstation", "microsoft.com"); 
httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds); 

進一步的閱讀Httpclent認證方案ü可以參考http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html#d5e947

但我的問題仍然是開放的,爲什麼HttpClent不採摘系統代理作爲簡單的Java程序做。

0

爲了獲取系統屬性,可以使用SystemDefaultHttpClient而不是DefaultHttpClient。

由於HttpClient的4.3,這一類被棄用,取而代之的HttpClientBuilder

HttpClient hc = new HttpClientBuilder().useSystemProperties().build();