一尘不染

Java-如何找到URL的重定向URL?

java

我正在通过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

有什么标准方法可以确定特定的URL将要重定向到哪个URL。

我知道,当一个URL重定向到其他URL时,服务器会发送一个中间响应,该响应包含一个Location标头字段,该字段告诉重定向的URL,但我没有通过该url.openConnection();方法收到该中间响应。


阅读 913

收藏
2020-03-08

共2个答案

一尘不染

你需要转换URLConnectionHttpURLConnection并指示它不是通过设置跟随重定向HttpURLConnection#setInstanceFollowRedirects()false。你还可以通过进行全局设置HttpURLConnection#setFollowRedirects()

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

2020-03-08
一尘不染

在调用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();

如果你需要在实际获取内容之前就知道重定向是否发生了,请看以下示例代码:

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 );
2020-03-08