我正在尝试从此页面检索链接:http://www.seas.harvard.edu/academics/areas
页面中间有一个名为“计算机科学”的链接。其基础链接为“/academics/areas/computer-science”。我可以使用 Java 内置 URL 类将其转换为绝对 URL,获得“http://www.seas.harvard.edu/academics/areas/computer-science”。
但是,当我在 Chrome 浏览器中单击链接时,绝对 URL 变为“http://www.seas.harvard.edu/computer-science”。
所以我的问题有两个方面:
- URL 重定向在此页面中如何工作?
- Java 中是否有任何库或方法可以帮助我在重定向后获取 URL?
我需要获取重定向后的 URL,因为我想阅读页面的源代码,但重定向前的 URL 对我不起作用。我正在使用 JSoup
库从 URL 中读取,所以我怀疑它可能是基于 javascript 的重定向。
最佳答案
从 curl --dump-header [file] [URL]
文件看起来像:
HTTP/1.1 301 Moved Permanently
Age: 0
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html
Date: Tue, 13 Aug 2013 13:00:12 GMT
ETag: "1376398812"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 13 Aug 2013 13:00:12 GMT
Location: http://www.seas.harvard.edu/computer-science
Server: nginx
Vary: Accept-Encoding
Via: 1.1 varnish
X-AH-Environment: prod
X-Cache: MISS
X-Drupal-Cache: MISS
X-Redirect-ID: 44
X-Varnish: 2704315535
transfer-encoding: chunked
Connection: keep-alive
如您所见,这是服务器提供的 301 永久重定向。
获取数据:
您可以使用 HttpURLConnection 进行连接,但在连接之前,请调用 myConn.setInstanceFollowRedirects(true)
。遵循重定向,您可以获得输出流并阅读它。
获取 URL 本身:
您可以使用 HttpURLConnection
进行连接,但在连接之前,调用 myConn.setInstanceFollowRedirects(false)
以不跟随重定向。这会将实际 URL 保存在正确的位置。
这里的技巧是,出于某些奇怪的原因,HttpURLConnection 不允许通过name 检索 header ,除非您将其解析为日期。
因此,您需要迭代一个整数,在建立连接后调用 getHeaderFieldKey
并检查它是否等于 Location
,如果是,则获取 getHeaderField
使用相同的整数来获取位置。很烦人,我知道。但位置不是日期,这是 JRE 的疏忽。
关于java - 网页重定向如何在此页面中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18209759/