web-dev-qa-db-fra.com

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 savoir l'URL vers laquelle l'URL précédente a redirigé.

Voici les champs d'en-tête que j'ai reçus 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, actuellement, 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 l'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(); .

59
Yatendra Goel

Vous devez convertir le URLConnection en HttpURLConnection et lui demander de ne pas suivre les redirections en définissant HttpURLConnection#setInstanceFollowRedirects() à false. Vous pouvez également le définir globalement par HttpURLConnection#setFollowRedirects() .

Vous n'avez alors qu'à gérer vous-même les redirections. Vérifiez le code de réponse par HttpURLConnection#getResponseCode() , récupérez l'en-tête Location par URLConnection#getHeaderField() puis lancez un nouveau HTTP demande à ce sujet.

53
BalusC

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 devez savoir si la redirection s'est produite avant d'obtenir réellement 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 );
86
amobiz
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, passez simplement en mode développeur de l'un de vos navigateurs installés (par exemple, appuyez sur F12 sur Google Chrome). Allez ensuite dans l'onglet 'Réseau' puis cliquez sur l'une des demandes. Vous devriez voir ses détails. Appuyez simplement sur le sous-onglet 'En-têtes' (l'image ci-dessous) request details

8
Mohsen Abasi

Jetez un œil à la classe HttpURLConnectiondocumentation de l'API , en particulier setInstanceFollowRedirects().

1
b_erb

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

0
Raymond Kroeker