Java - Comment trouver l'url redirigée d'une url?

J'accède aux pages web via java comme suit:

URLConnection con = url.openConnection();

Mais dans certains cas, une url redirige vers une autre url. Je veux donc connaître l'url vers laquelle l'url précédente a été redirigée.

Voici les champs d'en-tête que j'ai obtenus en réponse:

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]

Donc, à l'heure actuelle, je construis l'url redirigée à partir de la valeur du champ d'en-tête Set-Cookie. Dans le cas ci-dessus, l'url redirigée est copenhagen.craigslist.org

Existe-t-il un moyen standard par lequel je peux déterminer quelle url le url particulière va rediriger.

Je sais que lorsqu'une url redirige vers une autre url, le serveur envoie une réponse intermédiaire contenant un champ d'en-tête Location qui indique l'url redirigée mais je ne reçois pas cette réponse intermédiaire via la méthode url.openConnection();.

56
demandé sur Yatendra Goel 2010-04-17 19:56:26

6 réponses

, Vous devez lancer le URLConnection à HttpURLConnection et le charger de pas suivre les redirections par la mise en HttpURLConnection#setInstanceFollowRedirects() de false. Vous pouvez également le définir globalement par HttpURLConnection#setFollowRedirects().

Vous avez seulement besoin de gérer les redirections vous-même alors. Vérifiez le code de réponse par HttpURLConnection#getResponseCode(), saisissez l'en-tête Location par URLConnection#getHeaderField() et puis lancez une nouvelle requête HTTP dessus.

50
répondu BalusC 2010-04-17 16:04:04

Appelez simplement getUrl () sur L'instance URLConnection après avoir appelé 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();

Si vous avez besoin de savoir si la redirection s'est produite avant d'obtenir son contenu, Voici l'exemple de code:

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 );
81
répondu amobiz 2013-07-08 12:30:28
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;
}

Pour obtenir" User-Agent "et" Referer " par vous-même, allez simplement en mode développeur de l'un de vos navigateurs installés (par exemple, appuyez sur F12 sur Google Chrome). Ensuite, allez à l'onglet "Réseau" puis cliquez sur l'une des demandes. Vous devriez voir ses détails. Appuyez simplement sur' en-têtes ' sous-onglet (l'image ci-dessous) détails de la demande

7
répondu Mohsen Abasi 2017-11-29 11:16:45

Jetez un oeil à la HttpURLConnection classe documentation de L'API , en particulier setInstanceFollowRedirects().

1
répondu b_erb 2010-04-17 16:03:45

Je suggère en fait d'utiliser une bibliothèque open-source solide en tant que client http. Si vous jetez un oeil à http client par ASF vous trouverez la vie beaucoup plus facile. C'est un client facile à utiliser,évolutif et robuste pour http.

0
répondu Raymond Kroeker 2010-04-17 16:23:21

@balusC j'ai fait ce que vous avez écrit . Dans mon cas, j'ai ajouté des informations sur les cookies pour pouvoir réutiliser la 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);
-3
répondu franzu 2015-09-11 12:59:42