用 HttpClient 5 限定 RestTemplate 的代理凭据范围
在把传输层交给 Spring 6 RestTemplate 之前,将 Apache HttpClient 5 的凭据限定到代理主机和端口。
代理登录属于传输层的凭据提供器。对于 Spring 6 搭配 Apache HttpClient 5 的情况,请把该账户限定在中介上:
var proxy = new org.apache.hc.core5.http.HttpHost(
"http", "proxy.example", 8080);
var credentials = new org.apache.hc.client5.http.impl.auth
.BasicCredentialsProvider();
credentials.setCredentials(
new org.apache.hc.client5.http.auth.AuthScope(proxy),
new org.apache.hc.client5.http.auth.UsernamePasswordCredentials(
proxyUser, proxyPassword.toCharArray()));
var http = org.apache.hc.client5.http.impl.classic.HttpClients.custom()
.setProxy(proxy)
.setDefaultCredentialsProvider(credentials)
.build();
var factory = new org.springframework.http.client
.HttpComponentsClientHttpRequestFactory(http);
var rest = new org.springframework.web.client.RestTemplate(factory);应用提供 proxyUser 和 proxyPassword 值,并掌管 HTTP 客户端的生命周期。请为工作负载复用 rest,而不要在调用点再构建一个默认模板。
AuthScope 限定了该凭据的适用范围。示例提供的是普通的用户名/密码凭据;BasicCredentialsProvider 这个名字并不强制每次质询都使用 HTTP Basic 方案。
当目标是 HTTPS 时,传输层可以在 CONNECT 期间回应代理质询,此时应用的加密 HTTP 请求尚不存在。通用目标拦截器添加 Proxy-Authorization 并不等同于这一协商。
请分别配置任何目标账户。如果代理仍然拒绝请求,请保留它公布的认证方案以及实际的主机和端口。为其他端点限定的凭据不会仅仅因为密码正确就匹配。