我需要使用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);
...
答案 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);