Spring RestTemplate redirect 302
The redirection is followed automatically if the request is a GET request (see this answer). To make it happen on POST requests, one option might be to use a different request factory, like HttpComponentsClientHttpRequestFactory
, and set it to use an HttpClient
with the required settings to follow the redirect (see LaxRedirectStrategy):
final RestTemplate restTemplate = new RestTemplate(); final HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); final HttpClient httpClient = HttpClientBuilder.create() .setRedirectStrategy(new LaxRedirectStrategy()) .build(); factory.setHttpClient(httpClient); restTemplate.setRequestFactory(factory);
I haven't tested, but this should work.
https://stackoverflow.com/questions/32392634/spring-resttemplate-redirect-302
Spring的RestTemplate自动重定向,如何拿到重定向后的地址?
第一种解决方案
既然知道了spring会设置自动重定向,那么要禁止自动重定向就很简单了。我们写一个类来继承SimpleClientHttpRequestFactory,然后复写prepareConnection方法,把该属性设置为false即可,代码如下:
public class NoRedirectSimpleClientHttpRequestFactory extends SimpleClientHttpRequestFactory { @Override protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException { super.prepareConnection(connection, httpMethod); connection.setInstanceFollowRedirects(false); } }
那么该如何在创建的时候使用这个ClientHttpRequestFactory 呢,一种简单的方法直接在创建RestTemplate的时候传入参数即可
private static final RestTemplate REST_TEMPLATE = new RestTemplate(new NoRedirectSimpleClientHttpRequestFactory());
这样的话就返回的结果就是302了,可以在header中的"Location"拿到重定向的地址,再使用另外的RestTemplate来请求下载就可以了。但是spring既然提供了功能强大的RestTemplateBuilder,我们就要学会使用它,如下,可以顺便设置下超时时间之类的属性:
private static final RestTemplate REST_TEMPLATE = new RestTemplateBuilder() .requestFactory(NoRedirectSimpleClientHttpRequestFactory.class) .setConnectTimeout(Duration.ofMillis(3000)) .setConnectTimeout(Duration.ofMillis(5000)) .build();
https://blog.csdn.net/m0_37657841/article/details/107391699
feign 怎么处理302的响应?【测试未通过,copy过来留一个思路】
1.如果直接使用Feign,可以通过修改Options来实现是否自动跳转,默认是true,也就是自动重定向。
Request.Options customerOptions = new Request.Options(10_000, 20_000, false);
Feign.builder().options(customerOptions).build();
2.如果使用Spring的open-feign,则可以通过修改配置文件来实现。
feign:
httpclient:
follow-redirects: false
https://segmentfault.com/q/1010000014239099
https://wenku.csdn.net/answer/e54f3d1b7a9a4a40a04ee4150811ff8b