可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I've been trying to configure the user and password for proxy authentication from the configured properties while using Apaches HttpComponent's httpclient, but with no success. All examples I have found refer to methods and classes that are no longer available, such as HttpState
and setProxyCredentials
.
So, can anyone give me an example of how to configure the proxy credentials?
回答1:
For Basic-Auth it looks like this:
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 is not supported out of the box. But you might be able to manage that using NTCredentials
and maybe overloading DefaultProxyAuthenticationHandler
.
回答2:
For anyone looking for the answer for 4.3...its fairly new and their example didn't use the new HttpClientBuilder...so this is how I implemented this in that version:
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();
回答3:
Instead of NTLM one can use just plain old username and password on 4.3+ httpClient, as follows:
HttpHost proxy = new HttpHost("x.x.com",8080); Credentials credentials = new UsernamePasswordCredentials("username","password"); AuthScope authScope = new AuthScope("x.x.com", 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"));
回答4:
How to setup proxy authentication using Apache's httpclient
(Pre-authorization on proxy networks)
This answer uses Apache's HttpClient v4.1 and later.
The accepted answer didn't work for me, but I found something else that did!
Here's some tested, verified code from apache that demonstrates how to authenticate through a proxy for a HTTP request.
The full documentation is located here: https://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html .
There's also an excellent example from Apache here: https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientProxyAuthentication.java
- Replace
my_username
with your proxy username - Replace
my_password
with your proxy password - Replace
proxy.mycompany.com
with your proxy host - Replace
8080
with your proxy port - Replace
google.com
with the host of the site that you want to send your HTTP request to. - Replace
/some-path
with the path that you want to send the HTTP request to. This uses the host site you specified earlier (google.com).
The following example will authenticate username:password@proxy.mycompany.com:8080
and send a GET
request to http://www.google.com/some-path
and will print the response HTTP code.
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(); }
回答5:
A simpler thing worked for me for 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);
回答6:
For HttpClient 4.5 and per request authentication:
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);