Java - 如何找到网址的重定向网址?

2022-08-31 14:40:33

我通过java访问网页,如下所示:

URLConnection con = url.openConnection();

但在某些情况下,一个网址会重定向到另一个网址。所以我想知道以前的网址重定向到的网址。

以下是我作为响应获得的标题字段:

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]

因此,目前,我正在从标头字段的值构造重定向的url。在上面的例子中,重定向的网址是Set-Cookiecopenhagen.craigslist.org

是否有任何标准方法可以确定特定URL将重定向哪个URL。

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


答案 1

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

答案 2

您需要通过将 HttpURLConnection#setInstanceFollowRedirects() 设置为 来强制转换为 并指示它不要遵循重定向。您也可以通过 HttpURLConnection#setFollowRedirects() 全局设置它。URLConnectionHttpURLConnectionfalse

您只需要自己处理重定向即可。检查 HttpURLConnection#getResponseCode() 的响应代码,通过 URLConnection#getHeaderField() 获取标头,然后对其发出新的 HTTP 请求。Location