java urlconnection获取最终重定向的URL

我有一个重定向到另一个url的url。我希望能够获得最终重定向的URL。我的代码:

public class testURLConnection { public static void main(String[] args) throws MalformedURLException, IOException { HttpURLConnection con =(HttpURLConnection) new URL( "http://tinyurl.com/KindleWireless" ).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(); 

}}

它始终提供原始URL,而redirectURL是: http ://www.amazon.com/Kindle-Wireless-Reading-Display-Globally/dp/B003FSUDM4/ref=amb_link_353259562_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-10&pf_rd_r=11EYKTN682A79T370AM3&pf_rd_t=201&pf_rd_p = 1270985982&pf_rd_i = B002Y27P3M 。

我怎样才能获得最终重定向的URL。

这是我尝试循环直到我们得到重定向.Still doesent获取所需的url:

  public static String fetchRedirectURL(String url) throws IOException { HttpURLConnection con =(HttpURLConnection) new URL( url ).openConnection(); //System.out.println( "orignal url: " + con.getURL() ); con.setInstanceFollowRedirects(false); con.connect(); InputStream is = con.getInputStream(); if(con.getResponseCode()==301) return con.getHeaderField("Location"); else return null; } public static void main(String[] args) throws MalformedURLException, IOException { String url="http://tinyurl.com/KindleWireless"; String fetchedUrl=fetchRedirectURL(url); System.out.println("FetchedURL is:"+fetchedUrl); while(fetchedUrl!=null) { url=fetchedUrl; System.out.println("The url is:"+url); fetchedUrl=fetchRedirectURL(url); } System.out.println(url); } 

试试这个,我递归使用许多重定向URL。

 public static String getFinalURL(String url) throws IOException { HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); con.setInstanceFollowRedirects(false); con.connect(); con.getInputStream(); if (con.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM || con.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) { String redirectUrl = con.getHeaderField("Location"); return getFinalURL(redirectUrl); } return url; } 

和使用:

 public static void main(String[] args) throws MalformedURLException, IOException { String fetchedUrl = getFinalURL(""); System.out.println("FetchedURL is:" + fetchedUrl); } 
 public static String getFinalRedirectedUrl(String url) { HttpURLConnection connection; String finalUrl = url; try { do { connection = (HttpURLConnection) new URL(finalUrl) .openConnection(); connection.setInstanceFollowRedirects(false); connection.setUseCaches(false); connection.setRequestMethod("GET"); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode >= 300 && responseCode < 400) { String redirectedUrl = connection.getHeaderField("Location"); if (null == redirectedUrl) break; finalUrl = redirectedUrl; System.out.println("redirected url: " + finalUrl); } else break; } while (connection.getResponseCode() != HttpURLConnection.HTTP_OK); connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } return finalUrl; } 

我的第一个想法是将instanceFollowRedirects设置为false,或者使用URLConnection

在这两种情况下,重定向都不会被执行,因此您将收到对原始请求的回复。 获取HTTP状态值,如果是3xx,则获取新的重定向值。

当然可能存在一系列重定向,因此您可能希望迭代直到到达真实(状态2xx)页面。

@ user719950在我的MAC-OSX上 – 这解决了截断的HTTP URL的问题:

对于您的原始代码,只需将以下内容添加到以下行://您必须通过浏览器找到IE / Chrome正在发送的请求标头。 我仍然没有解释为什么这个简单的设置导致正确的URL 🙂

 HttpURLConnection con =(HttpURLConnection) new URL ( "http://tinyurl.com/KindleWireless" ).openConnection(); con.setInstanceFollowRedirects(true); con.setDoOutput(true); System.out.println( "orignal url: " + con.getURL() ); **con.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17");** con.connect(); System.out.println( "connected url: " + con.getURL() ); Thread.currentThread().sleep(2000l); InputStream is = con.getInputStream(); System.out.println( "redirected url: " + con.getURL() ); is.close(); 

这可能有所帮助

 public static void main(String[] args) throws MalformedURLException, IOException { HttpURLConnection con = (HttpURLConnection) new URL( "http://tinyurl.com/KindleWireless").openConnection(proxy); System.out.println("orignal url: " + con.getURL()); con.connect(); con.setInstanceFollowRedirects(false); int responseCode = con.getResponseCode(); if ((responseCode / 100) == 3) { String newLocationHeader = con.getHeaderField("Location"); responseCode = con.getResponseCode(); System.out.println("Redirected Location " + newLocationHeader); System.out.println(responseCode); } } 

@JEETS您的fetchRedirectURL函数可能无法正常工作,因为重定向有多种HTTP代码。 将其更改为范围检查,它将起作用。

 public static String fetchRedirectURL(String url) throws IOException { HttpURLConnection con =(HttpURLConnection) new URL( url ).openConnection(); //System.out.println( "orignal url: " + con.getURL() ); con.setInstanceFollowRedirects(false); con.connect(); InputStream is = con.getInputStream(); if(con.getResponseCode()>=300 && con.getResponseCode() <400) return con.getHeaderField("Location"); else return null; } 

如果有多个重定向,这个递归递归:

 protected String getDirectUrl(String link) { String resultUrl = link; HttpURLConnection connection = null; try { connection = (HttpURLConnection) new URL(link).openConnection(); connection.setInstanceFollowRedirects(false); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_MOVED_TEMP) { String locationUrl = connection.getHeaderField("Location"); if (locationUrl != null && locationUrl.trim().length() > 0) { IOUtils.close(connection); resultUrl = getDirectUrl(locationUrl); } } } catch (Exception e) { log("error getDirectUrl", e); } finally { IOUtils.close(connection); } return resultUrl; }