【问题标题】:Java HttpURLConnection - enumerate all 302 redirect hopsJava HttpURLConnection - 枚举所有 302 重定向跃点
【发布时间】:2018-03-28 05:29:40
【问题描述】:

我的目标是使用 java.net.HttpURLConnection 来解析给定 URL 的所有 302 重定向跃点。

这是我的 sn-p 代码(我实际上在 Talend SW 中使用它):

String url = row2.url;
java.net.HttpURLConnection con = (java.net.HttpURLConnection) new java.net.URL(url).openConnection();
con.setInstanceFollowRedirects(false);
con.connect();
String realURL = con.getHeaderField("Location");

System.out.println(realURL);

如果只有一个 302 回复,效果很好。 例如,如果我填充 row2.ulr="https://jigsaw.w3.org/HTTP/300/302.html" 代码将输出 -> https://jigsaw.w3.org/HTTP/300/Overview.html 女巫是 100% 正确的。

我的问题是我无法解析几个 302 回复,一个典型的例子是 Facebook URL: www.facebook.com/ID_account -> 重定向-> www.facebook.com/ACCOUNT_NAME

在线使用重定向检查器,我发现 2 - 302 响应(我需要第二个):

这是 CURL 输出:

> >>> http://www.facebook.com/123456789
> 
> > --------------------------------------------
> > 302 Found
> > --------------------------------------------
> 
> Status:   302 Found Code: 302
> Location: https://www.facebook.com/123456789 Vary:    Accept-Encoding
> Content-Type: text/html; charset=UTF-8
> X-FB-Debug:   Muf4PfCP9TRKCO17QUf7SV2vsdnrCu6Gw2+sjWAKe0QPGdAToJPcmgH5LHv3NIAhzsJXfPB3a9/mVtuhiiEihA==
> Date: Mon, 16 Oct 2017 16:02:55 GMT Connection:   close
> Content-Length:   0
> 
> 
> 
> 
> >>> https://www.facebook.com/123456789
> 
> > --------------------------------------------
> > 302 Found
> > --------------------------------------------
> 
> Status:   302 Found Code: 302 X-XSS-Protection:   0
> public-key-pins-report-only:  max-age=600;
> pin-sha256="WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18=";
> pin-sha256="k2v657xBsOVe1PQRwOsHsw3bsGT2VzIqz5K+59sNQws=";
> pin-sha256="gMxWOrX4PMQesK9qFNbYBxjBfjUvlkn/vN1n+L9lE5E=";
> pin-sha256="q4PO2G2cbkZhZ82+JgmRUyGMoAeozA+BSXVXQWB8XWQ=";
> report-uri="http://reports.fb.com/hpkp/" Pragma:  no-cache
> Location: https://www.facebook.com/a_name_account/
> Cache-Control:    private, no-cache, no-store, must-revalidate
> X-Frame-Options:  DENY Strict-Transport-Security: max-age=15552000;
> preload X-Content-Type-Options:   nosniff Expires:    Sat, 01 Jan 2000
> 00:00:00 GMT Vary:    Accept-Encoding Content-Type:   text/html;
> charset=UTF-8
> X-FB-Debug:   j2KCBNZ1poIJ0xUeeQYbinpcqq2avoI4z8eWb9Dx/yUUg98uyGYGadydia7en1s5X4DJeaJB7VjxYaRvP+psCw==
> Date: Mon, 16 Oct 2017 16:02:55 GMT Connection:   close
> Content-Length:   0
> 
> 
> 
> 
> >>> https://www.facebook.com/a_name_account/

关于如何找到第二个 302“位置”的任何建议 ->https://www.facebook.com/a_name_account/

提前致谢 注册 S.

【问题讨论】:

    标签: java httpurlconnection http-status-code-302


    【解决方案1】:

    这对于Recursive Method 来说是一个很好的行为。

    如果您确定响应标头中仍有位置,则可以继续调用您的方法。

    public void recurseLocation(String url) {
    
        URL url = new URL(location);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setInstanceFollowRedirects(false);
        connection.connect();
        String newLocation = connection.getHeaderField("Location");
    
        if (newLocation != null) {
            newLocation = recurseLocation(newLocation);
        } else {
            newLocation = location;
        }
    
        return newLocation;
    }
    

    【讨论】:

    • 谢谢,但是有没有一种方法可以简单地获得总索引 302 而无需递归调用函数?
    • 你能解释一下 URL url = new URL(location); 吗?谢谢
    • 我相信您必须为每个重定向提出请求。没有一种神奇的方法可以仅通过一个 http 请求来获取所有重定向。我们只需要艰难地通过所有这些并找到最后一个......
    • URL url = new URL(location); 创建一个新的 URL 对象。 Is 与您对 (java.net.HttpURLConnection) new java.net.URL(url).openConnection(); 行所做的没有什么不同。我只是对代码进行了更多的分解,以便更清楚地说明正在发生的事情。
    • 前两个请求并不完全相同。第一个请求是到一个 http url(注意 http 上缺少的 s)。第二个请求转到 https。第三个请求然后重定向到用户名。通常,网站会强制使用 https,因此第一个请求会从 http 重定向到 https。希望对您有所帮助。
    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多