Follow 302 redirect using Spring restTemplate?

前端 未结 3 782
庸人自扰
庸人自扰 2020-12-06 16:19
  RestTemplate restTemplate = new RestTemplate();

  final MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter();
  final L         


        
相关标签:
3条回答
  • 2020-12-06 16:35

    When using the CommonsClientHttpRequestFactory (which uses HttpClient v3 underneath) you can override the postProcessCommonsHttpMethod method and set to follow redirects.

    public class FollowRedirectsCommonsClientHttpRequestFactory extends CommonsClientHttpRequestFactory {
    
      @Override
      protected void postProcessCommonsHttpMethod(HttpMethodBase httpMethod) {
        httpMethod.setFollowRedirects(true);
      }
    }
    

    You can then use it like this (with optional, possibly preconfigured, HttpClient instance) and requests will follow the location headers in response:

    RestTemplate restTemplate = new RestTemplate(
          new FollowRedirectsCommonsClientHttpRequestFactory());
    
    0 讨论(0)
  • 2020-12-06 16:37

    Are you trying to redirect from one protocol to another, e.g. from http to https or vise versa? If so the automatic redirect won't work. See this comment: URLConnection Doesn't Follow Redirect

    After discussion among Java Networking engineers, it is felt that we shouldn't automatically follow redirect from one protocol to another, for instance, from http to https and vise versa, doing so may have serious security consequences

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

    Otherwise if you debug the RestTemplate code you will see that by default HttpURLConnection is set properly with getInstanceFollowRedirects() == true.

    0 讨论(0)
  • 2020-12-06 16:51

    Using the default ClientHttpRequestFactory implementation - which is the SimpleClientHttpRequestFactory - the default behaviour is to follow the URL of the location header (for responses with status codes 3xx) - but only if the initial request was a GETrequest.

    Details can be found in this class - searching for the following method:

    protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
    
        ...
    
        if ("GET".equals(httpMethod)) {
            connection.setInstanceFollowRedirects(true);
        }
    

    Here the relevant doc comment of HttpURLConnection.setInstanceFollowRedirects method:

    Sets whether HTTP redirects (requests with response code 3xx) should be automatically followed by this {@code HttpURLConnection} instance.

    The default value comes from followRedirects, which defaults to true.

    0 讨论(0)
提交回复
热议问题