Java – 如何findURL的redirect的url?

我通过java访问网页如下:

URLConnection con = url.openConnection(); 

但在某些情况下,一个url会redirect到另一个url。 所以我想知道以前的urlredirect的url。

以下是我作为回应得到的标题字段:

 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] 

所以目前,我正在从Set-Cookie头字段的值构造redirect的url。 在上述情况下,redirect的url是copenhagen.craigslist.org

有没有什么标准的方式,我可以确定哪个url的特定url将redirect。

我知道,当一个urlredirect到其他url时,服务器发送一个包含Location头域的中间响应,告诉redirect的url,但是我没有通过url.openConnection();接收到这个中间响应url.openConnection(); 方法。

您需要将URLConnectionHttpURLConnection并通过将HttpURLConnection#setInstanceFollowRedirects()false来指示它遵循redirect。 您也可以通过HttpURLConnection#setFollowRedirects()来全局设置它。

你只需要自己处理redirect。 通过HttpURLConnection#getResponseCode()检查响应代码,通过URLConnection#getHeaderField()获取Location标题,然后在其上激发一个新的HTTP请求。

调用getInputStream()后,只需在URLConnection实例上调用getUrl():

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

如果您需要知道redirect是否在实际获取内容之前发生,请使用以下示例代码:

 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", crawl.Crawl.User_Agent); con.addRequestProperty("Accept-Language", "en-US,en;q=0.8"); con.addRequestProperty("Referer", crawl.Crawl.Referer_General); 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; } 

看看HttpURLConnection类的API文档 ,特别是setInstanceFollowRedirects()

我实际上build议使用一个坚实的开源库作为一个http客户端。 如果你看看ASF的http客户端 ,你会发现生活更容易。 这是一个易于使用,可扩展和强大的http客户端。

@balusC我照你写的那样做了。 就我而言,我已经添加了cookie信息以便能够重用会话。

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