Spring RestTemplate如何携带cookie进行重定向?

13

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

经过一些调查,似乎第一个向指定的远程服务发出的请求实际上只是一个302重定向(到自身)并带有一些Set-Cookie头部信息。如果我使用“普通”浏览器,它会确认这个头部信息,正确设置cookie,并跟随重定向到应该收到正常的200响应的位置。

我发现RestTemplate不接受Set-Cookie头部信息,因此重定向会一遍又一遍地进行。

有没有办法使RestTemplate仅在当前请求中确认Set-Cookie头部信息?我最好不要让它保留状态,因为RestTemplate也会被系统的其他部分使用。

谢谢


这是你想要做的吗?还有这个? - ha9u63a7
@ha9u63ar 两个链接都会在请求头中添加一个cookie。我不想进行两个单独的请求(第一个请求停止重定向,嗅探“Set-Cookie”头,将其添加到第二个请求并执行)。我希望RestTemplate跟随重定向(它已经这样做了),同时也要注意“Set-Cookie”头。 - Robin Jonsson
3个回答

12

Spring 默认的请求工厂 (SimpleClientHttpRequestFactory) 不处理 cookies。使用具有 Apache HttpClient 的请求工厂替换它,该请求工厂能够处理 cookies:

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);

1

在Michal Foksa回答之前,我以另一种方式解决了这个问题。

解决它的一种方法是实现一个线程本地的cookie管理器,并将其设置为系统默认值。这将使RestTemplate使用cookie管理器存储cookie,并在请求线程结束时释放cookie管理器。

问候


-2
最好使用最新版本的httpclient。默认情况下,Spring Rest模板不允许设置标头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接