我正在使用apache commons 3.1来实现具有代理支持的httpClient。 我试图通过代理连接到远程主机。配置代理服务器时没有任何身份验证,但远程主机配置了身份验证。 当我通过属性文件传递代理参数时,它会在执行时发出警告:
警告 - BASIC @ xx.xx.xx.xx不支持所需的代理凭据 警告 - 请求抢占式身份验证,但没有可用的默认代理凭据
但执行仍在继续。
另一方面,当我通过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")));
}
答案 0 :(得分: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;
}
}