我正在通过Java访问网页,如下所示:
URLConnection con = url.openConnection();
但是在某些情况下,一个URL重定向到另一个URL。所以我想知道以前的URL重定向到的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标头字段的值构造重定向的url 。在上述情况下,重定向的网址为copenhagen.craigslist.org
Set-Cookie
copenhagen.craigslist.org
有什么标准方法可以确定特定的URL将要重定向到哪个URL。
我知道,当一个URL重定向到其他URL时,服务器会发送一个中间响应,该响应包含一个Location标头字段,该字段告诉重定向的URL,但我没有通过该url.openConnection();方法收到该中间响应。
url.openConnection()
你需要转换URLConnection到HttpURLConnection并指示它不是通过设置跟随重定向HttpURLConnection#setInstanceFollowRedirects()到false。你还可以通过进行全局设置HttpURLConnection#setFollowRedirects()。
URLConnection
HttpURLConnection
HttpURLConnection#setInstanceFollowRedirects()
false
HttpURLConnection#setFollowRedirects()
然后,你只需要自己处理重定向。通过检查响应代码,通过HttpURLConnection#getResponseCode()抓取Location标头URLConnection#getHeaderField(),然后在其上激发一个新的HTTP请求。
HttpURLConnection#getResponseCode()
URLConnection#getHeaderField()
在调用getInputStream()之后,只需在URLConnection实例上调用getUrl()即可:
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();
如果你需要在实际获取内容之前就知道重定向是否发生了,请看以下示例代码:
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 );