java - 使用 RestTemplate 的 Spring 4.0.0 基本身份验证

标签 java spring apache basic-authentication resttemplate

我目前正致力于将第三方应用程序与我们的本地报告系统集成。我想使用基本身份验证实现 REST 调用,但在 Spring 4.0.0 中遇到问题。我有一个简单的解决方案,效果很好:

final RestTemplate restTemplate = new RestTemplate();
final String plainCreds = "username:password";
final byte[] plainCredsBytes = plainCreds.getBytes();
final byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
final String base64Creds = new String(base64CredsBytes);

final HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds);
final HttpEntity<String> request = new HttpEntity<String>(headers);

final ResponseEntity<MyDto> response = restTemplate.exchange("myUrl", HttpMethod.GET, request, MyDto.class);
final MyDto dot = response.getBody();

但想重写它以通过以下方式使用 ClientHttpRequestFactory:

final RestTemplate restTemplate = new RestTemplate(createSecureTransport("username", "password"));

private ClientHttpRequestFactory createSecureTransport(final String username, final String password) {
    final HttpClient client = new HttpClient();
    final UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, password);
    client.getState().setCredentials(new AuthScope(null, 9090, AuthScope.ANY_REALM), credentials);
    return new CommonsClientHttpRequestFactory(client);
}

此代码未编译,因为 Spring 4.0.0 中不再存在 CommonsClientHttpRequestFactory 类。有人知道对此的任何替代解决方案吗?我在这个 REST 世界中很新,因此任何帮助都将不胜感激。

最佳答案

我知道这是一个老问题,但我自己正在寻找这个问题的答案。配置 RestTemplate 时需要添加 RestTemplate 拦截器。注解配置中的示例如下:

@Bean
public RestTemplate restTemplate() {

    final RestTemplate restTemplate = new RestTemplate();

    restTemplate.setMessageConverters(Arrays.asList(
            new FormHttpMessageConverter(),
            new StringHttpMessageConverter()
    ));
    restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("client", "secret"));

    return restTemplate;
}

BasicAuthorizationInterceptor 的 Javadoc .

我被困了好几个小时。也许它会在不久的将来帮助某人。

关于java - 使用 RestTemplate 的 Spring 4.0.0 基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998405/

相关文章:

java - 将字节转换为带符号字节的字符串

java - 自动装箱/拆箱 java Long 类型作为返回值时出现意外的 NullPointerException

java - 基于 "pure Spring"的 servlet 是否具有像基于 CXF 的 WSDL 那样的端点 URL?

java - 使用 spring 3 以用户可以更改的频率运行作业/异步任务

java - Docker:组合多个图像

java - @RequestBody 无法读取 MultiMap

java - Spring Boot 或 Node js 应用程序的管理 UI

apache - ping 请求是否会给服务器带来负载?

perl - mod_perl 并在子进程中继承 STDIN

linux - 如何使用 Apache 和 Yocto 将一个简单的网站构建到嵌入式 Linux 中?