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]
Итак, в настоящее время я создаю перенаправленный url из значения поля заголовка Set-Cookie
. В приведенном выше случае перенаправленный URL-адрес copenhagen.craigslist.org
Есть ли какой-либо стандартный способ, с помощью которого я могу определить, какой URL-адрес будет перенаправлен конкретным URL-адресом.
Я знаю, что когда URL-адрес перенаправляется на другой URL-адрес, сервер отправляет промежуточный ответ, содержащий поле заголовка Location
, которое указывает перенаправленный URL-адрес, но я не получаю этот промежуточный ответ методом url.openConnection();
.
Ответы
Ответ 1
Вам нужно отбросить URLConnection
до HttpURLConnection
и проинструктировать его не, следуя переадресации, установив HttpURLConnection#setInstanceFollowRedirects()
до false
. Вы также можете установить его глобально HttpURLConnection#setFollowRedirects()
.
Вам нужно только обработать переадресацию. Проверьте код ответа HttpURLConnection#getResponseCode()
, возьмите заголовок Location
URLConnection#getHeaderField()
и затем запустить новый HTTP-запрос.
Ответ 2
Просто вызовите 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 );
Ответ 3
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), Затем перейдите на вкладку "Сеть", а затем щелкните по одному из запросов. Вы должны увидеть подробности. Просто нажмите вкладку "Заголовки" (изображение ниже)
![информация о запросе]()
Ответ 4
Взгляните на HttpURLConnection
класс документацию API, особенно setInstanceFollowRedirects()
.
Ответ 5
Я бы предложил использовать твердую библиотеку с открытым исходным кодом в качестве http-клиента. Если вы посмотрите на http client от ASF, вы найдете жизнь намного проще. Это простой в использовании, масштабируемый и надежный клиент для http.
Ответ 6
@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);