除了目标站点凭据之外,如何在Apache httpclient中指定代理身份验证凭据?

时间:2015-05-22 11:52:21

标签: java authentication proxy apache-httpclient-4.x

我需要使用Apache httpclient通过代理连接到远程网站。 代理和网站都使用具有不同登录/密码的基本身份验证。 我有以下代码通过代理连接到远程站点。 但我无法弄清楚如何在那里添加代理凭证。 有什么想法吗?

...
    this.proxy = RequestConfig.custom()
            .setProxy(new HttpHost(host, port, scheme)).build();
    this.proxyEnabled = true;
...
    CredentialsProvider credsProvider = new BasicCredentialsProvider();

    Credentials creds = new UsernamePasswordCredentials(this.username,
            this.password);

    if (debug) {
        credsProvider.setCredentials(AuthScope.ANY, creds);
    } else {
        credsProvider.setCredentials(new AuthScope(this.getHost(), -1),
                creds);
    }

    CloseableHttpClient client = HttpClients.custom()
            .setDefaultCredentialsProvider(credsProvider).build();


    try {

        if (proxyEnabled) {
            httpRequest.setConfig(this.proxy);

        }

        CloseableHttpResponse response = client.execute(httpRequest);
...

1 个答案:

答案 0 :(得分:3)

CredentialsProvider可以管理多个AuthScope,例如, BasicCredentialsProvider中的实施(请注意对credMap.put()的调用):

@Override
public void setCredentials(
        final AuthScope authscope,
        final Credentials credentials) {
    Args.notNull(authscope, "Authentication scope");
    credMap.put(authscope, credentials);
}

因此,只需为每个范围调用setCredentials()即可:

CredentialsProvider credsProvider = new BasicCredentialsProvider();

AuthScope siteScope = new AuthScope(siteHost, sitePort);
Credentials siteCreds = new UsernamePasswordCredentials(siteUsername, sitePassword);
credsProvider.setCredentials(siteScope, siteCreds);

AuthScope proxyScope = new AuthScope(proxyHost, proxyPort);
Credentials proxyCreds = new UsernamePasswordCredentials(proxyUsername, proxyPassword);
credsProvider.setCredentials(proxyScope, proxyCreds);