Java-URL의 리디렉션 된 URL을 찾는 방법은 무엇입니까?
다음과 같이 Java를 통해 웹 페이지에 액세스하고 있습니다.
URLConnection con = url.openConnection();
그러나 어떤 경우에는 URL이 다른 URL로 리디렉션됩니다. 그래서 이전 URL이 리디렉션 된 URL을 알고 싶습니다.
다음은 응답으로받은 헤더 필드입니다.
null-->[HTTP/1.1 200 OK]
Cache-control-->[public,max-age=3600]
last-modified-->[Sat, 17 Apr 2010 13:45:35 GMT]
Transfer-Encoding-->[chunked]
Date-->[Sat, 17 Apr 2010 13:45:35 GMT]
Vary-->[Accept-Encoding]
Expires-->[Sat, 17 Apr 2010 14:45:35 GMT]
Set-Cookie-->[cl_def_hp=copenhagen; domain=.craigslist.org; path=/; expires=Sun, 17 Apr 2011 13:45:35 GMT, cl_def_lang=en; domain=.craigslist.org; path=/; expires=Sun, 17 Apr 2011 13:45:35 GMT]
Connection-->[close]
Content-Type-->[text/html; charset=iso-8859-1;]
Server-->[Apache]
그래서 현재 Set-Cookie
헤더 필드 의 값에서 리디렉션 된 URL을 구성하고 있습니다. 위의 경우 리디렉션 된 URL은copenhagen.craigslist.org
특정 URL이 리디렉션 할 URL을 결정할 수있는 표준 방법이 있습니까?
URL이 다른 URL로 리디렉션되면 서버 Location
가 리디렉션 된 URL을 알려주는 헤더 필드가 포함 된 중간 응답을 보내지 만 url.openConnection();
메서드를 통해 중간 응답을받지 못하고 있다는 것을 알고 있습니다.
당신은 캐스팅 필요 URLConnection
로 HttpURLConnection
하고 그것을 지시 하지 설정하여 리디렉션을 수행 HttpURLConnection#setInstanceFollowRedirects()
에 false
. 을 사용하여 전역 적으로 설정할 수도 있습니다 HttpURLConnection#setFollowRedirects()
.
그런 다음 리디렉션 만 처리하면됩니다. 로 응답 코드를 확인하고 헤더를 HttpURLConnection#getResponseCode()
가져 와서 새 HTTP 요청을 실행하십시오.Location
URLConnection#getHeaderField()
getInputStream ()을 호출 한 후 URLConnection 인스턴스에서 getUrl ()을 호출하면됩니다.
URLConnection con = new URL( url ).openConnection();
System.out.println( "orignal url: " + con.getURL() );
con.connect();
System.out.println( "connected url: " + con.getURL() );
InputStream is = con.getInputStream();
System.out.println( "redirected url: " + con.getURL() );
is.close();
실제로 콘텐츠를 가져 오기 전에 리디렉션이 발생했는지 여부를 알아야하는 경우 샘플 코드는 다음과 같습니다.
HttpURLConnection con = (HttpURLConnection)(new URL( url ).openConnection());
con.setInstanceFollowRedirects( false );
con.connect();
int responseCode = con.getResponseCode();
System.out.println( responseCode );
String location = con.getHeaderField( "Location" );
System.out.println( location );
public static URL getFinalURL(URL url) {
try {
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setInstanceFollowRedirects(false);
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
con.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
con.addRequestProperty("Referer", "https://www.google.com/");
con.connect();
//con.getInputStream();
int resCode = con.getResponseCode();
if (resCode == HttpURLConnection.HTTP_SEE_OTHER
|| resCode == HttpURLConnection.HTTP_MOVED_PERM
|| resCode == HttpURLConnection.HTTP_MOVED_TEMP) {
String Location = con.getHeaderField("Location");
if (Location.startsWith("/")) {
Location = url.getProtocol() + "://" + url.getHost() + Location;
}
return getFinalURL(new URL(Location));
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return url;
}
To get "User-Agent" and "Referer" by yourself, just go to developer mode of one of your installed browser (E.g. press F12 on Google Chrome). Then go to tab 'Network' and then click on one of the requests. You should see it's details. Just press 'Headers' sub tab (the image below)
Have a look at the HttpURLConnection
class API documentation, especially setInstanceFollowRedirects()
.
I'd actually suggest using a solid open-source library as an http client. If you take a look at http client by ASF you'll find life a lot easier. It is an easy-to-use,scalable and robust client for http.
@balusC I did as you wrote . In my case , I've added cookie information to be able to reuse the session .
// get the cookie if need
String cookies = conn.getHeaderField("Set-Cookie");
// open the new connnection again
conn = (HttpURLConnection) new URL(newUrl).openConnection();
conn.setRequestProperty("Cookie", cookies);
참고URL : https://stackoverflow.com/questions/2659000/java-how-to-find-the-redirected-url-of-a-url
'programing tip' 카테고리의 다른 글
C의 전체 "for"루프 구문은 무엇입니까? (0) | 2020.12.07 |
---|---|
iPhone SDK :보기 내에서 비디오를 재생하는 방법은 무엇입니까? (0) | 2020.12.07 |
TRUNCATE와 DELETE FROM의 장단점 (0) | 2020.12.07 |
laravel 5.5 비활성으로 인해 페이지가 만료되었습니다. (0) | 2020.12.06 |
Android-@drawable String에서 리소스 열기 (0) | 2020.12.06 |