2012-11-02 43 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);' –