【问题标题】:Does a URL that redirects to some other URL always contain the string '=http'?重定向到其他 URL 的 URL 是否总是包含字符串 '=http'?
【发布时间】: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 的登录页面时遇到了几个问题:

  1. 有时响应码为 3xx,但位置标头为空。
  2. 有时响应代码是 3xx,并且位置标头包含有效的 URL:
    • 有时此 URL 是“最终的”。
    • 有时此 URL 包含另一个重定向。
  3. 有时响应代码是 2xx,但 URL 包含另一个重定向。

我发现上面的代码是访问给定 URL 的目标网页的最简单方法,但在极少数情况下,我仍然会得到一个包含另一个重定向的 URL。

【问题讨论】:

  • 3xx 代码并不总是会导致重定向。继续关注重定向。此外,像 Apache 的 HttpComponents 这样的 HTTP 客户端可以为您完成所有这些工作。

标签: java httpurlconnection http-redirect url-redirection


【解决方案1】:

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

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

Location = "Location" ":" absoluteURI

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

【讨论】:

猜你喜欢
  • 2014-01-19
  • 2012-01-05
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多