Spring RestTemplate 遵循重定向与 cookie

2022-09-04 22:05:38

最近我遇到了一个问题,我需要对远程服务进行请求(我假设使用一个简单的servlet),RestTemplate返回了。GETToo many redirects!

经过一些调查,似乎对指定的远程服务发出的第一个请求实际上只是一个带有一些标头的302重定向(到自身)。如果我使用的是“普通”浏览器,它会确认标头,正确设置cookie,并按照重定向进行操作,它应该满足正常的200响应。Set-Cookie

我发现RestTemplate不接受标题,因此重定向一遍又一遍。Set-Cookie

有没有办法让 RestTemplate 仅针对当前请求确认标头?我最好不希望它保持状态,因为RestTemplate也从系统的其他部分使用。Set-Cookie

问候


答案 1

Spring 默认请求工厂 () 不处理 Cookie。用Apache的请求工厂替换它,Apache能够使用cookie:SimpleClientHttpRequestFactoryHttpClient

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

CloseableHttpClient httpClient = HttpClientBuilder
    .create()
    .build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(factory);

答案 2

我确实以另一种方式解决了这个问题,而不是Michal Foksa。(在他回答这个问题之前)

解决它的一种方法是实现线程本地cookie管理器,并将其设置为系统默认值。这将使 RestTemplate 与 cookiemanager 一起存储 cookie,并在请求线程失效后释放 cookiemanager。

问候