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();
.
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.
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 );
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)
Jetez un oeil à la HttpURLConnection
classe documentation de L'API , en particulier setInstanceFollowRedirects()
.
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.
@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);