Apache HttpClient 4.1 - 代理验证

Dan*_*ral 24 java proxy proxy-authentication apache-httpclient-4.x

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

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

Hot*_*tel 37

对于任何寻找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();
Run Code Online (Sandbox Code Playgroud)


nfe*_*ner 25

对于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);
Run Code Online (Sandbox Code Playgroud)

开箱即用不支持AFAIK NTLM.但是你可能能够使用NTCredentials并且可能超载来管理它DefaultProxyAuthenticationHandler.


Vis*_*hnu 15

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

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"));
Run Code Online (Sandbox Code Playgroud)

  • 如果我尝试使用`UsernamePasswordCredentials`作为需要NTLM身份验证的代理,我会得到以下异常:`auth.HttpAuthenticator(HttpAuthenticator.java:207) - NTLM身份验证错误:凭据不能用于NTLM身份验证:org.apache. http.auth.UsernamePasswordCredentials`.为了解决这个问题,我使用了`NTCredentials` (2认同)

Kat*_*tie 6

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

(代理网络上的预授权)

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

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

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

完整文档位于: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).

以下示例将对请求进行身份验证username:password@proxy.mycompany.com:8080并发送GET请求http://www.google.com/some-path,并将打印响应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();
    }
Run Code Online (Sandbox Code Playgroud)