【问题标题】:Java - How to find the redirected url of a url?Java - 如何找到网址的重定向网址?
【发布时间】:2011-02-09 04:21:48
【问题描述】:

我通过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。在上述情况下,重定向的 url 是copenhagen.craigslist.org

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

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

【问题讨论】:

    标签: java url http-headers


    【解决方案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 );
    

    【讨论】:

    • 在撰写/编辑帖子时,请遵循侧边栏中的格式说明,而不是尝试使用 HTML 标签进行格式设置。结果更漂亮。
    • 很好的答案,能够复制和粘贴第一段代码,并且立即生效。
    • 很好的答案,如果第一部分失败(重定向的 url = 原始 url),那么第二部分可以解决问题。
    • con.getURL 在重定向到“https”地址(例如google.com)时不会为我返回正确的 URL,无论是 301 还是 302(都尝试过)
    • 谢谢!!它对我有很大帮助!
    【解决方案2】:

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

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

    【讨论】:

    • 有什么区别。在setInstanceFollowRedirects()setFollowRedirects 方法之间。我检查了 API,但无法理解差异。两者之间。
    • 是的。我还明确说过,“..您可以通过.. 全局设置它”。按照 API 文档的链接。它们准确地描述了这些方法的作用。
    • @BalusC 你能分享一些代码来手动处理重定向
    【解决方案3】:
    public static URL getFinalURL(URL url) {
        try {
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setInstanceFollowRedirects(false);
            con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
            con.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
            con.addRequestProperty("Referer", "https://www.google.com/");
            con.connect();
            //con.getInputStream();
            int resCode = con.getResponseCode();
            if (resCode == HttpURLConnection.HTTP_SEE_OTHER
                    || resCode == HttpURLConnection.HTTP_MOVED_PERM
                    || resCode == HttpURLConnection.HTTP_MOVED_TEMP) {
                String Location = con.getHeaderField("Location");
                if (Location.startsWith("/")) {
                    Location = url.getProtocol() + "://" + url.getHost() + Location;
                }
                return getFinalURL(new URL(Location));
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return url;
    }
    

    要自己获取“User-Agent”和“Referer”,只需进入您已安装浏览器之一的开发者模式(例如在 Google Chrome 上按 F12) .然后转到“网络”选项卡,然后单击其中一个请求。你应该看到它的细节。只需按“标题”子选项卡(下图)

    【讨论】:

    • 什么是“爬取”对象?
    【解决方案4】:

    看看HttpURLConnectionAPI documentation,尤其是setInstanceFollowRedirects()

    【讨论】:

      【解决方案5】:

      我实际上建议使用可靠的开源库作为 http 客户端。如果您查看 ASF 的 http client,您会发现生活变得轻松多了。它是一个易于使用、可扩展且功能强大的 http 客户端。

      【讨论】:

      • 请发布您在使用 HttpClient 时如何回答这个特定问题。
      【解决方案6】:

      @balusC 我照你写的做了。就我而言,我添加了 cookie 信息以便能够重用会话。

         // get the cookie if need
          String cookies = conn.getHeaderField("Set-Cookie");
      
          // open the new connnection again
          conn = (HttpURLConnection) new URL(newUrl).openConnection();
          conn.setRequestProperty("Cookie", cookies);
      

      【讨论】:

      • 这和问题有什么关系?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 2018-05-09
      相关资源
      最近更新 更多