使用Spring restTemplate跟随302重定向?

时间:2015-04-02 17:09:16

标签: java spring redirect resttemplate

  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。这个假设我不正确吗?我现在需要选择这个位置并重新申请?

3 个答案:

答案 0 :(得分:17)

使用默认ClientHttpRequestFactory实施 - 即SimpleClientHttpRequestFactory - 默认行为是遵循位置标头的网址(对于状态代码为3xx的响应) - 但仅限于初始请求是GET请求。

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

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

    ...

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

此处HttpURLConnection.setInstanceFollowRedirects方法的相关文档评论:

  

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

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

答案 1 :(得分:0)

使用CommonsClientHttpRequestFactory(使用下面的HttpClient v3)时,您可以覆盖postProcessCommonsHttpMethod方法并设置为关注重定向。

public class FollowRedirectsCommonsClientHttpRequestFactory extends CommonsClientHttpRequestFactory {

  @Override
  protected void postProcessCommonsHttpMethod(HttpMethodBase httpMethod) {
    httpMethod.setFollowRedirects(true);
  }
}

然后您可以像这样使用它(使用可选的,可能是预先配置的HttpClient实例),请求将在location标题后面响应:

RestTemplate restTemplate = new RestTemplate(
      new FollowRedirectsCommonsClientHttpRequestFactory());

答案 2 :(得分:0)

您是否要从一种协议重定向到另一种协议,例如从http到https或反之亦然?如果是这样,自动重定向将无法正常工作。查看此评论:URLConnection Doesn't Follow Redirect

  

经过Java Networking工程师的讨论,我们认为   不应自动遵循从一种协议到另一种协议的重定向,   例如,从http到https,反之亦然,例如   严重的安全后果

来自https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4620571

否则,如果您调试RestTemplate代码,则会看到默认情况下HttpURLConnectiongetInstanceFollowRedirects() == true的设置正确。