30X 번대의 Redirection 을 RestTemplate 에서 따라 가는 방법

30X 번대 Http Response Status 에 대해 정리를 하자면 아래와 같다.

301Moved Permanently* 요청된 리소스에는 새로운 URI가 지정되어 있기 때문에, 이후로는 새 URI를 사용해야 한다는 것을 나타냄. (영구적인 URI 변경)302Found* 요청된 리소스에는 새로운 URI가 지정되어 있기 때문에, 이후로는 새 URI를 사용해야 한 다는 것을 나타냄. 301과 유사하지만, 302는 일시적인 URI 이동)303See Other* 이 응답은 요청에 대한 리소스는 다른 URI에 있기 때문에 GET 메서드를 사용해서 얻어야 한다는 것을 나타냄. 302 코드와 같지만, 303은 리디렉션 위치를 GET 메서드를 통해 얻어야 한다고 명확하게 되어 있음.304Not Modified* 요청한 리소스가 마지막 요청 이후 변경된 적이 없기 때문에 기존 클라이언트의 로컬 캐시 리소스를 사용하도록 알려줌.300번대로 분류되어 있지만, 리디렉션과는 관계없는 처리를 함.307Temporary Redirect* 임시로 페이지를 리다이렉트 함.출처: https://ooz.co.kr/260 [이러쿵저러쿵]

기본적으로 RestTemplate 의 HttpClient에서는 Get Method 요청에 대한
30X 처리는 Response Location Header를 참조하여 따라간다.

apache HttpClient 의 기본 Redirect 전략은 
org.apache.http.impl.client.DefaultRedirectStrategy 를 사용하며
GET, HEAD 요청에 대해서만 Redirect 응답인 경우 따라가게끔 되어있다.

비 정상적인 경우지만, Post 같은 Http Method 요청에 대해서도 Redirect 되어야 하는 경우에는 어떻게 처리하면 될까.

DefaultRedirectStrategy 나 RedirectStrategy 를 구현, 상속받아 사용해도 되지만. 이미 존재한다.

org.apache.http.impl.client.LaxRedirectStrategy

LaxRedirectStrategy 의 경우 GET,POST,HEAD,DELETE 의 Http Method에 대해서도 redirect를 허용한다.

CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(requestConfig)
.setRedirectStrategy(new LaxRedirectStrategy()) // post redirect 허용
.build();

위와 같이 RedirectStrategy를 주입하면 되겠다.

curl 로 redirection follow 하게끔 요청 할 경우에는

-L, --location      Follow redirects (H)
  • L 옵션을 주어서 테스트 하면 Header 의 Location을 따라 redirection 한다.

Written by

엘디는 사랑입니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store