Java HttpURLConnection - 枚举所有 302 重定向跃点

Java HttpURLConnection - enumerate all 302 redirect hops

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

这是我的代码片段(我实际上在 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" the code will output -> 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 的任何建议 "Location" ->https://www.facebook.com/a_name_account/?

提前致谢 注册 S.

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

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

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;
}