1

我正在使用 apache commons 3.1 来实现具有代理支持的 httpClient。我正在尝试通过代理连接到远程主机。代理服务器配置为没有任何身份验证,但是远程主机配置了身份验证。当我通过属性文件传递代理参数时,它会在执行时发出警告:

WARN - 所需的代理凭据不适用于 BASIC @xx.xx.xx.xx WARN - 请求抢先身份验证,但没有可用的默认代理凭据

但执行继续进行。

另一方面,当我通过 JVM 参数传递代理参数时,再次给出相同的警告并停止执行。

这种行为有什么具体原因吗?通过属性文件和通过 JVM arg 传递代理参数有什么区别吗?

这是代码:

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")));
        }
4

1 回答 1

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;
    }
}
于 2012-11-02T16:58:10.940 回答