Java - Как найти перенаправленный URL-адрес URL? - PullRequest
58 голосов
/ 17 апреля 2010

Я захожу на веб-страницы через 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();.

Ответы [ 6 ]

86 голосов
/ 11 марта 2011

Просто вызовите 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 );
52 голосов
/ 17 апреля 2010

Вам необходимо привести значение URLConnection к HttpURLConnection и дать ему команду , а не , следуя переадресации, установив HttpURLConnection#setInstanceFollowRedirects() в false. Вы также можете установить его глобально с помощью HttpURLConnection#setFollowRedirects().

Тогда вам нужно обрабатывать перенаправления самостоятельно. Проверьте код ответа с помощью HttpURLConnection#getResponseCode(), захватите заголовок Location с помощью URLConnection#getHeaderField(), а затем выполните новый запрос HTTP для него.

8 голосов
/ 10 мая 2017
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). Затем перейдите на вкладку «Сеть» и затем нажмите на один из запросов. Вы должны увидеть это детали. Просто нажмите вкладку «Заголовки» (изображение ниже) request details

1 голос
/ 17 апреля 2010

Ознакомьтесь с документацией HttpURLConnection class API , особенно setInstanceFollowRedirects().

0 голосов
/ 11 сентября 2015

@ 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);
0 голосов
/ 17 апреля 2010

Я бы фактически предложил использовать надежную библиотеку с открытым исходным кодом в качестве http-клиента. Если вы посмотрите на http client от ASF, вам станет намного проще. Это простой в использовании, масштабируемый и надежный клиент для http.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...