重定向到其他URL的URL是否始终包含字符串'= http'?

时间:2013-12-28 17:17:58

标签: java httpurlconnection http-redirect url-redirection

我正在尝试使用Java / HttpURLConnection确定给定URL的最终位置。

代码非常简单,将String'ref'作为输入并返回URL字符串作为输出:

        HttpURLConnection con = (HttpURLConnection)new URL(ref).openConnection();
        con.setInstanceFollowRedirects(true);
        con.setRequestProperty("User-Agent","");
        if (con.getResponseCode()/100 == 3)
        {
            String target = con.getHeaderField("Location");
            if (target != null)
                return target;
        }
        return con.getURL().toString();

问题在于,在某些情况下,我得到的结果还包含另一个重定向。

不仅在响应代码为3xx时,而且在响应代码为2xx时也会发生这种情况。

我需要某种确定性的方法来决定是否应该将输出作为输入发送到同一方法(上图)。

我可以安全地假设结果包含重定向IF并且只有它包含字符串'= http'吗?

更新

澄清上述问题:

它不是“我的”服务器,它可以是我通过HTTP连接到的“那里”的任何服务器。

我在查找包含重定向的网址的着陆页时遇到了一些问题:

  1. 有时响应代码为3xx,但位置标头为空。
  2. 有时响应代码为3xx,位置标头包含有效的URL:
    • 有时这个网址是“最终的”。
    • 有时此网址包含另一个重定向。
  3. 有时响应代码为2xx,但URL包含另一个重定向。
  4. 上面的代码是我发现的最简单的到达给定URL登录页面的方法,但在极少数情况下,我仍然会得到一个包含另一个重定向的URL。

1 个答案:

答案 0 :(得分:2)

也许我误解了您的问题,但Location标题使用如下

  

对于201(已创建)响应,位置是新资源的位置   这是由请求创建的。对于3xx响应,位置   应该指出服务器自动重定向的首选URI   对资源。字段值由单个绝对URI组成。

     

Location = "Location" ":" absoluteURI

如果您的服务器没有这样的行为,那么它的行为不符合标准的HTTP方式,作为客户端,您需要一些带外信息才能使用它。