Apache HttpClient 4.1 – 代理validation

我一直在尝试使用Apaches HttpComponent的httpclient从配置的属性配置代理身份validation的用户和密码,但没有成功。 我找到的所有示例都引用了不再可用的方法和类,例如HttpStatesetProxyCredentials

那么,有人能举例说明如何配置代理凭证吗?

对于Basic-Auth,它看起来像这样:

 DefaultHttpClient httpclient = new DefaultHttpClient(); httpclient.getCredentialsProvider().setCredentials( new AuthScope("PROXY HOST", 8080), new UsernamePasswordCredentials("username", "password")); HttpHost targetHost = new HttpHost("TARGET HOST", 443, "https"); HttpHost proxy = new HttpHost("PROXY HOST", 8080); httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

开箱即用不支持AFAIK NTLM。 但您可以使用NTCredentials管理它,并可能重载DefaultProxyAuthenticationHandler

对于任何寻找4.3的答案的人来说…它相当新,他们的例子没有使用新的HttpClientBuilder ……所以我在这个版本中实现了这个:

 NTCredentials ntCreds = new NTCredentials(ntUsername, ntPassword,localMachineName, domainName ); CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( new AuthScope(proxyHost,proxyPort), ntCreds ); HttpClientBuilder clientBuilder = HttpClientBuilder.create(); clientBuilder.useSystemProperties(); clientBuilder.setProxy(new HttpHost(pxInfo.getProxyURL(), pxInfo.getProxyPort())); clientBuilder.setDefaultCredentialsProvider(credsProvider); clientBuilder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy()); CloseableHttpClient client = clientBuilder.build(); 

可以使用4.3+ httpClient上的普通旧用户名和密码代替NTLM,如下所示:

 HttpHost proxy = new HttpHost("xxcom",8080); Credentials credentials = new UsernamePasswordCredentials("username","password"); AuthScope authScope = new AuthScope("xxcom", 8080); CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials(authScope, credentials); HttpClient client = HttpClientBuilder.create().setProxy(proxy).setDefaultCredentialsProvider(credsProvider).build(); HttpResponse response=client.execute(new HttpGet("http://stackoverflow.com/questions/6962047/apache-httpclient-4-1-proxy-authentication")); 

如何使用Apache的httpclient设置代理身份validation

(代理网络上的预授权)

这个答案使用Apache的HttpClient v4.1及更高版本。

接受的答案对我不起作用,但我找到了其他的东西!

以下是来自apache的一些经过测试validation的代码,演示了如何通过代理对HTTP请求进行身份validation。

完整文档位于: https : //hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html 。

Apache也有一个很好的例子: https : //hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientProxyAuthentication.java

  • my_username替换为您的代理用户名
  • my_password替换为您的代理密码
  • proxy.mycompany.com替换为您的代理主机
  • 用代理端口替换8080
  • google.com替换为您要向其发送HTTP请求的网站的主机。
  • /some-path替换为您要将HTTP请求发送到的路径。 这使用您之前指定的主机网站(google.com)。

以下示例将validationusername:password@proxy.mycompany.com:8080并向http://www.google.com/some-path发送GET请求,并打印响应HTTP代码。

  CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( new AuthScope("proxy.mycompany", 8080), new UsernamePasswordCredentials("my_username", "my_password")); CloseableHttpClient httpclient = HttpClients.custom() .setDefaultCredentialsProvider(credsProvider).build(); try { //Replace "google.com" with the target host you want to send the request to HttpHost target = new HttpHost("google.com", 80, "http"); HttpHost proxy = new HttpHost("proxy.mycompany", 8080); RequestConfig config = RequestConfig.custom() .setProxy(proxy) .build(); CloseableHttpResponse response = null; //Replace "/some-path" with the path you want to send a get request to. HttpPost httppost = new HttpPost("/some-path"); httppost.setConfig(config); response = httpclient.execute(target, httppost); try { System.out.println("Return status code is "+response.getStatusLine().getStatusCode()); } finally { response.close(); } } finally { httpclient.close(); } 

NTLM对我来说更简单:

 httpclient.getCredentialsProvider().setCredentials( new AuthScope(proxy_host, proxy_port), new NTCredentials(this.proxy_user, this.proxy_pass, this.proxy_host, this.proxy_domain)); HttpHost proxy = new HttpHost(this.proxy_host, this.proxy_port, "http"); httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

对于HttpClient 4.5和每个请求身份validation:

 HttpContext httpContext = new BasicHttpContext(); AuthState authState = new AuthState(); authState.update(new BasicScheme(), new UsernamePasswordCredentials("userName", "password")); httpContext.setAttribute(HttpClientContext.PROXY_AUTH_STATE, authState); CloseableHttpResponse httpResponse = httpClient.execute(httpRequest, httpContext);