【问题标题】:Spring Rest template overwriting Authorization header valueSpring Rest模板覆盖授权标头值
【发布时间】:2019-07-19 16:51:10
【问题描述】:

我正在拨打休息电话,如下所示:

REST_TEMPLATE.exchange(
        external_rest_url,
        HttpMethod.POST,
        new HttpEntity<>(dto, getHeaders()),
        Map.class)

我的标题如下:

private HttpHeaders getHeaders() {
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.set("User-Agent","Spring's RestTemplate");
    headers.set(HttpHeaders.AUTHORIZATION, "some value");
    return headers;
}

当我运行我的代码时,标题 HttpHeaders.AUTHORIZATION 被替换为 undefined

从网络日志中查看以下快照中的请求标头:

有谁知道为什么 spring 会这样,或者特别是 spring-web:5.0.5 jar。我也尝试更改 jar 的版本,但结果相同。

我使用的Springboot版本是2.0.x

【问题讨论】:

  • User-Agent 也不一样,
  • 是的!你说的对。我不知道为什么当我将它设置为其他东西时它的设置不同
  • 如果您尝试将 Authorization 标头值设置为正确的语法 - Authorization: 怎么办?例如:授权:基本 YWxhZGRpbjpvcGVuc2VzYW1l
  • 你在混合东西。 resttemplate 用于从您的应用程序向另一台服务器发送 http 请求。屏幕截图显示您正在将请求发送到由@RequestMapping 方法处理的服务器(可能是您的服务器)
  • 浏览器中的请求与您在服务器上所做的事情有什么关系。你在比较不同的东西。您正在查看从浏览器到您的服务器的请求,而不是从服务器到另一台服务器的请求。

标签: java rest spring-boot spring-web


【解决方案1】:

如果您需要为所有请求添加相同的标头,您可以在 RestTemplate 中添加拦截器:

public void sampleHeader(final RestTemplate restTemplate){
    //Add a ClientHttpRequestInterceptor to the RestTemplate
    restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor(){
        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
            request.getHeaders().set(HttpHeaders.AUTHORIZATION, "some value");//Set the header for each request
            return execution.execute(request, body);
        }
    }); 
}

【讨论】:

  • 我尝试了您的解决方案,但标题被覆盖,就像我的情况一样。
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 2013-03-15
相关资源
最近更新 更多