[英]java urlconnection get the final redirected 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=11EYKT662A79T370AM3&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("<your_url_here>");
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.