Java – Come trovare l’URL reindirizzato di un URL?

Sto accedendo alle pagine web tramite java come segue:

URLConnection con = url.openConnection(); 

Ma in alcuni casi, un URL reindirizza a un altro URL. Quindi voglio sapere l’url a cui è stato reindirizzato l’url precedente.

Di seguito sono riportati i campi di intestazione che ho ricevuto come risposta:

 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] 

Quindi al momento sto costruendo l’url reindirizzato dal valore del campo intestazione Set-Cookie . Nel caso precedente, l’URL reindirizzato è copenhagen.craigslist.org

Esiste un modo standard attraverso il quale posso determinare quale URL l’indirizzo particolare sta per redirect.

So che quando un url reindirizza ad un altro URL, il server invia una risposta intermedia contenente un campo di intestazione Location che indica l’url reindirizzato ma non sto ricevendo quella risposta intermedia attraverso url.openConnection(); metodo.

È necessario eseguire il cast di URLConnection su HttpURLConnection e HttpURLConnection di non seguire i reindirizzamenti impostando HttpURLConnection#setInstanceFollowRedirects() su false . Puoi anche impostarlo globalmente tramite HttpURLConnection#setFollowRedirects() .

Allora devi solo gestire i reindirizzamenti. Controllare il codice di risposta HttpURLConnection#getResponseCode() , afferrare l’intestazione Location da URLConnection#getHeaderField() e quindi lanciare una nuova richiesta HTTP su di esso.

Basta chiamare getUrl () sull’istanza di URLConnection dopo aver chiamato 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(); 

Se hai bisogno di sapere se il reindirizzamento è avvenuto prima di ottenerne il contenuto, ecco il codice di esempio:

 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; } 

Per ottenere ” User-Agent ” e ” Referer ” da soli, vai alla modalità sviluppatore di uno dei tuoi browser installati (ad esempio premi F12 su Google Chrome). Quindi vai alla scheda ‘Rete’ e quindi fare clic su una delle richieste. Dovresti vedere i suoi dettagli. Basta premere la sottoscheda ‘Intestazioni’ (l’immagine sotto) richiesta dettagli

HttpURLConnection un’occhiata alla documentazione dell’API della class HttpURLConnection , in particolare setInstanceFollowRedirects() .

In realtà, suggerirei di utilizzare una solida libreria open source come client http. Se dai un’occhiata al client http di ASF, troverai la vita molto più semplice. È un client facile da usare, scalabile e robusto per http.

@balusC Ho fatto come hai scritto tu. Nel mio caso, ho aggiunto informazioni sui cookie per poter riutilizzare la sessione.

  // 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);