Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 网页重定向在此网页中如何工作?_Java_Javascript_Url_Redirect_Jsoup - Fatal编程技术网

Java 网页重定向在此网页中如何工作?

Java 网页重定向在此网页中如何工作?,java,javascript,url,redirect,jsoup,Java,Javascript,Url,Redirect,Jsoup,我正在尝试从此页面检索链接: 页的中间有一个叫做“计算机科学”的链接。其基本链接为“/学术/领域/计算机科学”。我能够使用Java内置URL类将其转换为绝对URL,获得“” 但是,当我在Chrome浏览器中单击链接时,绝对URL变为“” 所以我的问题有两个: URL重定向在此页面中如何工作 Java中是否有任何库或方法可以帮助我在重定向后获取URL 我需要在重定向后获取URL,因为我想阅读页面的源代码,但重定向前的URL对我不起作用。我正在使用JSoup库读取URL,因此我怀疑它可能是基于jav

我正在尝试从此页面检索链接:

页的中间有一个叫做“计算机科学”的链接。其基本链接为“/学术/领域/计算机科学”。我能够使用Java内置URL类将其转换为绝对URL,获得“”

但是,当我在Chrome浏览器中单击链接时,绝对URL变为“”

所以我的问题有两个:

  • URL重定向在此页面中如何工作
  • Java中是否有任何库或方法可以帮助我在重定向后获取URL

  • 我需要在重定向后获取URL,因为我想阅读页面的源代码,但重定向前的URL对我不起作用。我正在使用
    JSoup
    库读取URL,因此我怀疑它可能是基于javascript的重定向。

    我使用Fiddler进行调查,网站返回链接
    http://www.seas.harvard.edu/academics/areas/computer-science执行重定向的

    我想让你得到真正的网址。您应该对harvard.edu web服务器执行实际请求并解析响应。(重定向URL位于HTTP头中的
    位置
    键中)

    对不起,你的第二个问题。我不懂Java


    这个问题可能会有帮助()

    我使用Fiddler进行调查,网站返回链接
    http://www.seas.harvard.edu/academics/areas/computer-science执行重定向的

    我想让你得到真正的网址。您应该对harvard.edu web服务器执行实际请求并解析响应。(重定向URL位于HTTP头中的
    位置
    键中)

    对不起,你的第二个问题。我不懂Java

    这个问题可能会有帮助()

  • 例如,可能存在
    .htaccess
    mod_rewrite
    重定向。使用Firefox的控制台,我可以看到请求。如下图所示,服务器正在发回一条永久移动的
    301
    消息。这告诉浏览器重定向到响应的
    位置
    标题中返回的地址。
  • 获取更改URL的方式取决于加载页面的方式:
    • 如果您使用ready libraries&code将页面加载到例如DOM对象,您可以使用ready HTTP系统加载响应,这可能会导致它自动重定向->您将从加载页面的URL获取URL。如果没有,则必须检查状态代码301或302,当收到这些代码时,更改的URL位于响应的
      位置
      标题中
    • 如果您编写了自己的代码来通过TCP套接字加载响应,那么您必须按照正常方式加载响应,但再次检查301和302状态代码,并按照上一节中的说明进行操作
  • 例如,可能存在
    .htaccess
    mod_rewrite
    重定向。使用Firefox的控制台,我可以看到请求。如下图所示,服务器正在发回一条永久移动的
    301
    消息。这告诉浏览器重定向到响应的
    位置
    标题中返回的地址。
  • 获取更改URL的方式取决于加载页面的方式:
    • 如果您使用ready libraries&code将页面加载到例如DOM对象,您可以使用ready HTTP系统加载响应,这可能会导致它自动重定向->您将从加载页面的URL获取URL。如果没有,则必须检查状态代码301或302,当收到这些代码时,更改的URL位于响应的
      位置
      标题中
    • 如果您编写了自己的代码来通过TCP套接字加载响应,那么您必须按照正常方式加载响应,但再次检查301和302状态代码,并按照上一节中的说明进行操作
  • 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.setInstanceFlowRedirects(false)
    以不遵循重定向。这将把实际的URL保存在正确的位置

    这里的诀窍是,出于某种奇怪的原因,HttpURLConnection不允许按名称检索头,除非您将其解析为日期

    因此,您需要迭代一个整数,在建立连接并检查它是否等于
    Location
    之后调用
    getHeaderFieldKey
    ,如果等于,则使用相同的整数获取
    getHeaderField
    ,以获取位置。讨厌,我知道。但是位置不是日期,这是JRE的疏忽。

    来自
    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.setInstanceFlowRedirects(false)
    以不遵循重定向。这将把实际的URL保存在正确的位置

    这里的诀窍是,出于某种奇怪的原因,HttpURLConnection不允许按名称检索头,除非您将其解析为日期

    因此,您需要迭代一个整数,在建立连接并检查它是否为