Spring RestTemplate 遵循带有 cookie 的重定向
Spring RestTemplate follow redirect with cookie
最近我 运行 遇到一个问题,我需要向远程服务发出 GET
请求(我假设使用一个简单的 servlet),RestTemplate 返回 Too many redirects!
。
经过一些调查,似乎对指定远程服务的第一个请求实际上只是一个带有一些 Set-Cookie
header 的 302 重定向(到自身)。如果我使用的是 "normal" 浏览器,它会确认 header,正确设置 cookie,并遵循应该满足正常 200 响应的重定向。
我发现 RestTemplate 不接受 Set-Cookie
header,因此会一遍又一遍地进行重定向。
有没有办法让 RestTemplate 仅针对当前请求确认 Set-Cookie
header?我最好不希望它保持状态,因为系统的其他部分也使用 RestTemplate。
此致
Spring 默认请求工厂 (SimpleClientHttpRequestFactory
) 不处理 cookie。将其替换为具有 cookie 能力的 Apache HttpClient
的请求工厂:
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);
最好使用最新版本的httpclient。默认情况下 spring rest 模板不允许设置 header.
我确实以不同于 Michal Foksa 的方式解决了这个问题。 (在他回答之前)
解决它的一种方法是实现一个线程本地 cookiemanager,并将其设置为系统默认值。这将使 RestTemplate 使用 cookiemanager 存储 cookie,并在请求线程死后释放 cookiemanager。
此致
最近我 运行 遇到一个问题,我需要向远程服务发出 GET
请求(我假设使用一个简单的 servlet),RestTemplate 返回 Too many redirects!
。
经过一些调查,似乎对指定远程服务的第一个请求实际上只是一个带有一些 Set-Cookie
header 的 302 重定向(到自身)。如果我使用的是 "normal" 浏览器,它会确认 header,正确设置 cookie,并遵循应该满足正常 200 响应的重定向。
我发现 RestTemplate 不接受 Set-Cookie
header,因此会一遍又一遍地进行重定向。
有没有办法让 RestTemplate 仅针对当前请求确认 Set-Cookie
header?我最好不希望它保持状态,因为系统的其他部分也使用 RestTemplate。
此致
Spring 默认请求工厂 (SimpleClientHttpRequestFactory
) 不处理 cookie。将其替换为具有 cookie 能力的 Apache HttpClient
的请求工厂:
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);
最好使用最新版本的httpclient。默认情况下 spring rest 模板不允许设置 header.
我确实以不同于 Michal Foksa 的方式解决了这个问题。 (在他回答之前)
解决它的一种方法是实现一个线程本地 cookiemanager,并将其设置为系统默认值。这将使 RestTemplate 使用 cookiemanager 存储 cookie,并在请求线程死后释放 cookiemanager。
此致