【发布时间】:2014-01-16 00:31:31
【问题描述】:
我正在尝试使用 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 时。
我需要某种确定性的方法来决定是否应该将输出作为输入发送到相同的方法(如上)。
我可以安全地假设结果包含重定向如果且仅当它包含字符串'=http'?
更新:
为了澄清上面的问题:
它不是“我的”服务器,它可以是我通过 HTTP 连接到的任何“外面”的服务器。
我在查找包含重定向的 URL 的登录页面时遇到了几个问题:
- 有时响应码为 3xx,但位置标头为空。
- 有时响应代码是 3xx,并且位置标头包含有效的 URL:
- 有时此 URL 是“最终的”。
- 有时此 URL 包含另一个重定向。
- 有时响应代码是 2xx,但 URL 包含另一个重定向。
我发现上面的代码是访问给定 URL 的目标网页的最简单方法,但在极少数情况下,我仍然会得到一个包含另一个重定向的 URL。
【问题讨论】:
-
3xx 代码并不总是会导致重定向。继续关注重定向。此外,像 Apache 的 HttpComponents 这样的 HTTP 客户端可以为您完成所有这些工作。
标签: java httpurlconnection http-redirect url-redirection