使用Spring restTemplate关注302重定向?

2022-09-01 13:18:12
  RestTemplate restTemplate = new RestTemplate();

  final MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter();
  final List<MediaType> supportedMediaTypes = new LinkedList<MediaType>(converter.getSupportedMediaTypes());
  supportedMediaTypes.add(MediaType.ALL);
  converter.setSupportedMediaTypes(supportedMediaTypes);
  restTemplate.getMessageConverters().add(converter);  


  ResponseEntity<MyDTO[]> response = restTemplate.getForEntity(urlBase, MyDTO[].class);

  HttpHeaders headers = response.getHeaders();
  URI location = headers.getLocation(); // Has my redirect URI

  response.getBody(); //Always null

我的印象是,302会自动被跟踪。我的这个假设是错误的吗?我现在需要选择这个位置并重新请求?


答案 1

使用默认实现 ( 即 SimpleClientHttpRequestFactory - 默认行为是跟踪位置标头的 URL(对于带有状态代码的响应) - 但前提是初始请求是请求。ClientHttpRequestFactory3xxGET

可以在此类中找到详细信息 - 搜索以下方法:

protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {

    ...

    if ("GET".equals(httpMethod)) {
        connection.setInstanceFollowRedirects(true);
    }

以下是方法的相关文档注释:HttpURLConnection.setInstanceFollowRedirects

设置 HTTP 重定向(响应代码为 3xx 的请求)是否应自动后跟此 {@code HttpURLConnection} 实例。

默认值来自 followRedirects,默认值为 true。


答案 2

您是否尝试从一个协议重定向到另一个协议,例如从http重定向到https或反之亦然?如果是这样,自动重定向将不起作用。请参阅此评论:URL连接不遵循重定向

经过Java网络工程师的讨论,人们认为我们不应该自动遵循从一个协议到另一个协议的重定向,例如,从http到https,反之亦然,这样做可能会产生严重的安全后果。

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4620571 相比

否则,如果调试代码,您将看到默认情况下使用 正确设置了 。RestTemplateHttpURLConnectiongetInstanceFollowRedirects() == true