【问题标题】:Header values overwritten on redirect in HTTPClient在 HTTPClient 中重定向时覆盖的标头值
【发布时间】:2014-04-03 21:28:22
【问题描述】:

我正在使用 httpclient 4.2.5 来发出必须处理重定向的 http 请求。 这是一个理解上下文的小例子:

  1. A 向 B 发送 http 请求(使用 httpclient 4.2.5)
  2. B 将 302 重定向(包含指向 C 的 URL)发送回 A
  3. A 跟随重定向到 C
  4. C 检索请求 URL 并对其进行处理

如果 C 通过 request.getRequestURL() (HttpServlet API) 解析请求 URL,它包含例如步骤 1 中原始请求的主机和端口,这是错误的。

问题存在于第 2 步,其中 httpclient 处理重定向。它只是将所有标头从原始请求(步骤 1)复制到当前请求(步骤 3)。我已经通过 grepcode 查看了负责的代码:
DefaultRequestDirector

HttpUriRequest redirect = redirectStrategy.getRedirect(request, response, context);
HttpRequest orig = request.getOriginal();
redirect.setHeaders(orig.getAllHeaders());

我不太明白为什么将原始请求的所有标头都复制到当前请求中。
例如。使用 cURL 进行简单测试按预期进行,C 将收到正确的主机和端口。

实施我自己的重定向策略并没有帮助,因为在它之后复制了原始标头。

【问题讨论】:

    标签: java apache-httpclient-4.x


    【解决方案1】:

    我在尝试使用HttpClient 从 bitbucket 的下载部分下载文件时遇到了同样的问题。在第一个请求之后,bitbucket 向 CDN 发送重定向,如果设置了 Authorization 标头,CDN 会报错。

    我通过更改 DefaultRedirectStrategy.getRedirect() 方法来解决它,以返回不允许设置 Authorization 标头的重定向对象。

    我使用 Scala,所以这里是代码:

    val http = new DefaultHttpClient()
    http.setRedirectStrategy(new DefaultRedirectStrategy() {
      override def getRedirect(
        request: HttpRequest, response: HttpResponse, context: HttpContext
      ): HttpRequestBase = {
        val uri: URI = getLocationURI(request, response, context)
        val method: String = request.getRequestLine.getMethod
        if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {
          new HttpHead(uri) {
            override def setHeaders(headers: Array[Header]) {
              super.setHeaders(headers.filterNot(_.getName == "Authorization"))
            }
          }
        }
        else {
          new HttpGet(uri) {
            override def setHeaders(headers: Array[Header]) {
              super.setHeaders(headers.filterNot(_.getName == "Authorization"))
            }
          }
        }
      }
    })
    

    【讨论】:

      【解决方案2】:

      请注意orig.getAllHeaders() 返回由调用者显式添加到消息中的标头数组。上面发布的来自DefaultRequestDirector 的代码不会复制HttpClient 自动生成的请求标头,例如HostContent-LengthTransfer-Encoding 等。

      您发布了会话的电报日志,显示了该问题,我也许能够说明重定向无法按预期工作的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-08
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 2010-12-10
        • 2020-11-01
        相关资源
        最近更新 更多