2012-11-02 42 views
1

我使用apache commons 3.1來實現http代理支持。 我正嘗試通過代理連接到遠程主機。代理服務器配置沒有任何身份驗證,但是遠程主機配置了身份驗證。 當我將這個代理通過參數屬性文件,它給了警告,同時執行:Apache客戶端中的httpClient代理支持3.1

WARN - 搶先進行身份驗證請求,但沒有默認代理憑據 - 不適用於Basic @ XX.XX.XX.XX WARN需要代理證書availble

但是執行繼續。

另一方面,當我通過JVM參數傳遞代理參數時,再次發出相同的警告並停止執行。

這種行爲是否有任何特定的原因?在通過屬性文件和JVM參數傳遞代理參數方面是否有區別?

下面是代碼:

if(System.getProperty("http.proxyHost") != null && System.getProperty("http.proxyPort") != null) { 
      httpClient.getHostConfiguration().setProxy(System.getProperty("http.proxyHost"), Integer.parseInt(System.getProperty("http.proxyPort"))); 
     } 
     else if(AMXAdminTask.props.getProperty("http.proxyHost") != null && AMXAdminTask.props.getProperty("http.proxyPort") != null) { 
      httpClient.getHostConfiguration().setProxy(Propfile.props.getProperty("http.proxyHost"), Integer.parseInt(Propfile.props.getProperty("http.proxyPort"))); 
     } 

回答

0

貌似你試圖兩個非常不同的東西結合起來。您在上面發佈的代碼可以讓您通過代理,但遠程主機需要BASIC身份驗證。以下示例使用Jersey客戶端(用於在現有項目中進行RESTful調用),但您應該瞭解您需要執行的操作。如果你被困在使用Apache HttpComponents,看看這個: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html

import org.apache.commons.lang.StringUtils; 

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; 
import com.sun.jersey.client.apache.ApacheHttpClient; 
import com.sun.jersey.client.apache.config.ApacheHttpClientConfig; 
import com.sun.jersey.client.apache.config.DefaultApacheHttpClientConfig; 

public abstract class BaseProxyProvider { 
    protected Client getHttpClient() { 
     final DefaultApacheHttpClientConfig cc = new DefaultApacheHttpClientConfig(); 
     if (StringUtils.isNotEmpty(System.getProperty("http.proxyHost"))) { 
      cc.getProperties() 
        .put(ApacheHttpClientConfig.PROPERTY_PROXY_URI, 
          "http://" + System.getProperty("http.proxyHost") + ":" 
            + System.getProperty("http.proxyPort") + "/"); 
     } 
     Client c = ApacheHttpClient.create(cc); 

     c.addFilter(new HTTPBasicAuthFilter(WebAppPropertyReader.getProperties().getProperty(
       WebAppPropertyReader.SERVICE_USER), WebAppPropertyReader.getProperties().getProperty(
       WebAppPropertyReader.SERVICE_PASSWORD))); 
     return c; 
    } 
} 
+0

我能夠用相同的代碼小提琴手測試代理服務器。我可以從屬性文件和JVM ags傳遞代理參數。 – user1173339

+0

現在我遇到了有關代理服務器身份驗證的問題。我使用小提琴作爲代理服務器。我在代理服務器和遠程主機都有身份驗證。我在httpClient頭中設置了http代理憑證。但是我在響應中出現錯誤:「傳輸錯誤407:需要代理身份驗證。」並在提琴手中看到一條消息:「沒有WWW-驗證標題存在。」 – user1173339

+0

您需要爲您的代理用戶和密碼設置系統屬性: 'System.setProperty(「http.proxyUser」,authUser);' 'System.setProperty(「http.proxyPassword」,authPassword);' –