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

标签 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);
...

最佳答案

一个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);

关于java - 除了目标站点凭据之外,如何在 Apache httpclient 中指定代理身份验证凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30395999/

相关文章:

python - 使用 python mechanize 登录具有 NTLM 身份验证的页面

internet-explorer - 为 Chrome 设置独立代理设置的解决方法

java - 如何设置 JVM 使用的代理

防火墙后面的 meteor 包安装

java - JPA:一对多关系中阻抗不匹配的问题

java - 连接由对等方使用异步 http 客户端和 netty 重置

c# - 通过 C# 使用 Windows Hello 进行 Webauthn 身份验证

java - 扩展 CrudRepository 并仍然使用 Spring Data JPA 为自定义方法创建自己的实现

java - 我如何确保这些对象得到垃圾收集?

authentication - Google 多帐户登录将如何实现?