Java-как найти перенаправленный url-адрес url-адреса?
Я получаю доступ к веб-страницам через java следующим образом:
URLConnection con = url.openConnection();
но в некоторых случаях переадресация на другой 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]
поэтому в настоящее время я строю перенаправленный url-адрес из значения Set-Cookie
поля заголовка. В приведенном выше случае перенаправленный url-адрес copenhagen.craigslist.org
есть ли стандартный способ с помощью которого я могу определить, какой url-адрес будет перенаправлен.
Я знаю, что когда url-адрес перенаправляется на другой url-адрес, сервер отправляет промежуточный ответ, содержащий Location
поле заголовка, которое сообщает перенаправленный url, но я не получаю этот промежуточный ответ через url.openConnection();
метод.
6 ответов:
вы должны бросить
URLConnection
доHttpURLConnection
и поручить ему не следуйте перенаправляет, установивHttpURLConnection#setInstanceFollowRedirects()
доfalse
. Вы также можете установить его глобально поHttpURLConnection#setFollowRedirects()
.вам нужно только обрабатывать редиректы себя тогда. Проверьте код ответа с помощью
HttpURLConnection#getResponseCode()
, захватите наURLConnection#getHeaderField()
а затем запустить новый HTTP-запрос на него.
просто вызовите getUrl () на экземпляре URLConnection после вызова getInputStream ():
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; }
для " User-Agent" и " Referer " самостоятельно, просто перейдите в режим разработчика одного из установленных браузеров (например, нажмите F12 на Google Chrome). Затем перейдите на вкладку "Сеть" и нажмите на один из запросов. Вы должны видеть, что это детали. Просто нажмите на вкладку "заголовки" (изображение ниже)
посмотреть
HttpURLConnection
класс документация API, особенноsetInstanceFollowRedirects()
.
Я бы предложил использовать твердую библиотеку с открытым исходным кодом в качестве http-клиента. Если вы посмотрите на http client по АЧС, вы найдете жизнь намного проще. Это простой в использовании,масштабируемый и надежный клиент для http.
@balusC я сделал так, как вы написали . В моем случае , я добавил файлы cookie, чтобы иметь возможность повторно использовать сессии .
// 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);