2014-11-04 2 views
0

다른 URL로 리디렉션되고 다른 URL로 리디렉션되는 URL이 있으며 최종 도메인을 얻으려고합니다. 나는 리디렉션을 연결할 때 일어날 것이라고 생각하지만,이 코드를 실행 그렇지 않으면 저에게 말한다 :URL 리디렉션은 언제 발생합니까?

public static void main(String[] args) 
    { 
     System.out.println(resolveEndDomain("http://goo.gl/ELHEjl")); 
    } 

    private static String resolveEndDomain(String deepLink) 
    { 
     HttpURLConnection httpConnection = null; 
     try 
     { 
      httpConnection = (HttpURLConnection) new URL(deepLink).openConnection(); 
      //httpConnection.getResponseCode(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return httpConnection.getURL().getHost(); 
    } 

그래서, 내가 그것을 실행하면, 그냥 나에게 goo.gl을 줄 것이다. 그러나 응답 코드를 얻기 위해 줄의 주석을 지우면 끝 도메인에서 가져와 www.thomann.de을 인쇄합니다. getHeaderFields(), getContent() 또는 이와 유사한 문자를 사용하면 connect()이 도움이되지 않습니다. 나는 그 응답들에 관심이 없기 때문에 어떻게하면 갈 수 있고 리디렉션을 해결할 수 있습니까? 연결은 효과적으로 발생합니까?

+0

리디렉션은 일반적으로 클라이언트에게 다른 곳을 보도록 지시하는 서버의 응답입니다. 따라서 리디렉션은 일반적으로 서버 측에서 보내지 만 클라이언트는이를 따라야합니다. http 상태 코드를 확인하면 리디렉션되는 위치가 응답에 있음을 나타내는 301 또는 302가 표시됩니다. – Thomas

+0

'www.thoman.de'의 문제점. 나는 그것이 당신이 찾고있는 가치라고 말하지만 그렇지 않습니까? – SJuan76

+0

@ 토마스 아니요, 처음에는'HttpURLConnection.setFollowRedirects (false)'를 호출하면 코드가 301에 불과합니다. 그러나 false를 지정하지 않으면 링크를 자동으로 따라 가야하며 사실 getResponseCode()를 호출하면 200이됩니다. –

답변

0

귀하의 질문에 관해서는 연결중인 서버가 301 또는 302 HTTP 상태 코드로 응답 할 때 리디렉션이 발생합니다. 상태 코드는 서버의 응답에 포함되어 있으므로 실제로 자원을 요청해야합니다 (일반적으로 connect()).

이미 알 수 있듯이 HttpURLConnection은 보통 리디렉션 상태 코드 확인 부분을 처리하고 리디렉션 응답의 일부로 제공된 URL로 리디렉션합니다 (최대 리디렉션까지 최대 한도는 어디인지 모르겠습니다). 정의 됨).

당신은 followsRedirectsfalse에 설정하고 재 지정 여부 될 위하여려고하는 경우에 자신을 찾을 수있는 HTTP 헤더를 해석하지만 때까지 2X 상태 코드를 얻을 수 (또는 4XX는 -not 발견 forbidden- 또는 5XX -server 오류 수 -) 리디렉션되는 URL이 마지막 URL인지 확실하지 않습니다.

예를 들어 http://goo.gl/ELHEjl에 연결하면 http://www.bit.ly/s34314313으로 리디렉션됩니다. 그러나 그 URL에 연결하고 3XX가 아닌 상태 코드를 얻지 않으면 http://www.bit.ly/s34314313에 연결하는 것이 최종 리소스 위치인지 또는 다시 리디렉션하는지 여부를 확신 할 수 없습니다.

관련 문제