Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring RestTemplate和代理身份验证_Java_Spring_Spring Mvc_Proxy - Fatal编程技术网

Java Spring RestTemplate和代理身份验证

Java Spring RestTemplate和代理身份验证,java,spring,spring-mvc,proxy,Java,Spring,Spring Mvc,Proxy,我正试着用Spring做REST通话。据我所知,正确的方法是使用restemplate(?)。问题是,我支持一个代理 这是我现在的代码: SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); InetSocketAddress address = new InetSocketAddress(host, 3128); Proxy proxy = new Proxy(Proxy.Type.HTTP

我正试着用Spring做REST通话。据我所知,正确的方法是使用
restemplate
(?)。问题是,我支持一个代理

这是我现在的代码:

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
InetSocketAddress address = new InetSocketAddress(host, 3128);
Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
factory.setProxy(proxy);

RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(factory);

这似乎可行,但我需要在代理上进行身份验证,但这是如何做到的?
Proxy
类型以及
SimpleClientHttpRequestFactory
类型似乎无法处理凭据。没有证书,我只得到407…

下面的代码对我有用

RestTemplate restTemplate = new RestTemplate();

CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials( new AuthScope("proxyHost", "proxyPort"), new UsernamePasswordCredentials("proxyUser", "proxyPass") );
HttpClientBuilder clientBuilder = HttpClientBuilder.create();

clientBuilder.useSystemProperties();
clientBuilder.setProxy(new HttpHost("proxyHost", "proxyPort"));
clientBuilder.setDefaultCredentialsProvider(credsProvider);
clientBuilder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy());

CloseableHttpClient client = clientBuilder.build();

HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setHttpClient(client);

restTemplate.setRequestFactory(factory);

在做了很多不同的选择之后,我决定使用下面的代码,因为我可以在创建时为RestTemplate设置代理,这样我就可以将它重构为一个单独的方法。请注意,它还有一个额外的依赖项,所以请记住这一点

private RestTemplate createRestTemplate()引发异常{
最终字符串username=“myusername”;
最终字符串password=“myPass”;
最后一个字符串proxyUrl=“proxy.nyc.bigtower.com”;
最终int端口=8080;
CredentialsProvider credsProvider=新的BasicCredentialsProvider();
CredProvider.setCredentials(
新的AuthScope(proxyUrl,端口),
新用户名密码凭据(用户名、密码)
);
HttpHost myProxy=新的HttpHost(proxyUrl,端口);
HttpClientBuilder clientBuilder=HttpClientBuilder.create();
setProxy(myProxy).setDefaultCredentialsProvider(CredProvider.disableCookieManagement();
HttpClient HttpClient=clientBuilder.build();
HttpComponents客户端HttpRequestFactory工厂=新的HttpComponents客户端HttpRequestFactory();
工厂设置httpClient(httpClient);
返回新的REST模板(工厂);
}
//我使用的依赖项

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.2.5.RELEASE</version>
</dependency>

org.apache.httpcomponents
httpclient
4.5.2
org.springframework
弹簧网
4.2.5.1发布

如果您的代理需要基本身份验证,只需设置HTTP头
代理授权
即可处理身份验证:

final SimpleClientHttpRequestFactory=new SimpleClientHttpRequestFactory();
最终InetSocketAddress地址=新的InetSocketAddress(主机,3128);
最终代理=新代理(Proxy.Type.HTTP,地址);
工厂.setProxy(proxy);
最终字符串username=“阿拉丁”;
最终字符串密码=“打开芝麻”;
最终RestTemplate RestTemplate=新的RestTemplateBuilder()
.requestFactory(()->factory)
.defaultHeader(HttpHeaders.PROXY_授权,“基本”+Base64.getEncoder().encodeToString((用户名+':'+密码).getBytes(StandardCharsets.UTF_8)))
.build();

您不需要为此使用额外的依赖项。

如果我使用的是Spring 3.0.1,该怎么办?我没有HttpComponents类ClientHttpRequestFactory此解决方案与Spring3不向后兼容。您需要以不同的方式创建请求工厂。我不熟悉Spring3,所以你必须做一些研究。我强烈建议使用Spring4,因为Spring5已经在进行中。我知道,但不幸的是,在我的项目中,不可能升级到新版本。我转而使用未经验证的代理,并使用SimpleClientHttpRequestFactory(Spring 3.0.5),而不是HttpComponents客户端HttpRequestFactory(从Spring 3.1开始)