为什么Java的HttpsURLConnection和curl的HEAD请求返回不同的标头?

奥列克桑德(Oleksandr)

我注意到javax.net.ssl.HttpsURLConnection当我使用HEAD请求时,在响应缺少一些标头。

这是我使用的代码:

  public static void getHeaders() throws IOException, URISyntaxException {
        URL url = new URL("https://acme-v01.api.letsencrypt.org/terms");
        HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
        con.setRequestMethod("HEAD");
        con.getInputStream().close();
        System.out.println(con.getHeaderField("Location"));
        Map<String, List<String>> map = con.getHeaderFields();
        for (Map.Entry<String, List<String>> entry : map.entrySet()) {
            System.out.println("Key : " + entry.getKey() +
                    " ,Value : " + entry.getValue());
        }
    }

输出是下一个:

null
Key : X-Frame-Options ,Value : [DENY]
Key : null ,Value : [HTTP/1.1 200 OK]
Key : Cache-Control ,Value : [max-age=60987]
Key : Server ,Value : [nginx]
Key : ETag ,Value : ["582cdb9c-22004"]
Key : Connection ,Value : [keep-alive]
Key : Expires ,Value : [Thu, 01 Dec 2016 14:26:25 GMT]
Key : Last-Modified ,Value : [Wed, 16 Nov 2016 22:20:12 GMT]
Key : Date ,Value : [Wed, 30 Nov 2016 21:29:58 GMT]
Key : Content-Type ,Value : [application/pdf]

我们可以看到它没有返回“ Location”标头。

这是在同一服务器上执行的简单curl请求:

# curl -I https://acme-v01.api.letsencrypt.org/terms
HTTP/1.1 302 Moved Temporarily
Server: nginx
Content-Type: text/plain; charset=utf-8
Boulder-Request-Id: JBtoTNb6Q-vvdR5VF9j3gIP27S4RmEqaLjepyF60aVU
Location: https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf
Replay-Nonce: x7jscxXZ-90jzgLG8vkmunp7XrlLrMT0R4mzFV7xAhQ
X-Frame-Options: DENY
Strict-Transport-Security: max-age=604800
Content-Length: 0
Expires: Wed, 30 Nov 2016 21:37:03 GMT
Cache-Control: max-age=0, no-cache, no-store
Pragma: no-cache
Date: Wed, 30 Nov 2016 21:37:03 GMT
Connection: keep-alive

为什么相等的“ HEAD”请求返回不同的标头?

奥列克桑德(Oleksandr)

正如zapl在评论中所说,这是因为此链接具有重定向。而且似乎默认情况下HttpsURLConnection接受重定向。但是我们可以手动将其关闭:

con.setInstanceFollowRedirects(false);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的带有json参数和标头的HTTP POST请求返回400错误请求?

具有相同请求标头的BASH cURL和PHP cURL的不同响应

为什么为同源请求发送原始标头?

为什么要为请求缓存控制HTTP标头?

根据请求返回的 Flask REST api 标头以及标头究竟是什么

“ curl --cert”和“ curl --cacert”会读写哪些HTTP请求和响应标头?

为什么(返回)和返回不同?

Java为什么不读取“ Set-Cookie”标头?

每个环境的不同请求标头

为什么使用 cURL 上传的文件在文件的开头包含请求标头的一部分(例如边界、内容类型)?

PHP cURL可以在单个请求中检索响应标头和正文吗?

在vbscript中带有请求标头和有效负载的POST CURL

PHP将cURL和GET请求与标头一起使用

如何以最新的Postman版本v5.5.0获取Curl格式的请求正文和标头?

为什么空手道配置标头的行为与直接在后台设置标头的行为不同?

为什么symfony请求标头设置为二进制值,目的是什么?

什么是Java对象标头

CURL和HTTP中的x-oauth-basic标头不同。

HTTP请求使用不同的浏览器标头时会发生什么?

AFNetworking 2.0和请求标头

Python 和 seleniumrequests 获取请求标头

缓存控制标头和条件请求

全局添加标头和超时请求

AWS LAMBDA:访问请求标头和不同内容类型的正文?

范围HTTP标头请求文件的最后一个字节时返回什么?

为什么没有在响应中的get request中传递请求标头?

为什么我的HTTP请求标头字段中缺少主机?

为什么HTTP请求标头“ If-None-Match”如此称呼?

ASP.NET Core CORS请求被阻止;我的API为什么不应用正确的标头?