java - HTTPURLConnection 不遵循从 HTTP 到 HTTPS 的重定向

标签 java redirect https httpurlconnection http-redirect

我不明白为什么 Java 的 HttpURLConnection 不遵循从 HTTP 到 HTTPS URL 的 HTTP 重定向。我使用以下代码获取位于 https://httpstat.us/ 的页面:

import java.net.URL;
import java.net.HttpURLConnection;
import java.io.InputStream;

public class Tester {

    public static void main(String argv[]) throws Exception{
        InputStream is = null;

        try {
            String httpUrl = "http://httpstat.us/301";
            URL resourceUrl = new URL(httpUrl);
            HttpURLConnection conn = (HttpURLConnection)resourceUrl.openConnection();
            conn.setConnectTimeout(15000);
            conn.setReadTimeout(15000);
            conn.connect();
            is = conn.getInputStream();
            System.out.println("Original URL: "+httpUrl);
            System.out.println("Connected to: "+conn.getURL());
            System.out.println("HTTP response code received: "+conn.getResponseCode());
            System.out.println("HTTP response message received: "+conn.getResponseMessage());
       } finally {
            if (is != null) is.close();
        }
    }
}

这个程序的输出是:

Original URL: http://httpstat.us/301
Connected to: http://httpstat.us/301
HTTP response code received: 301
HTTP response message received: Moved Permanently

A request to http://httpstat.us/301 returns the following (shortened) response (which seems absolutely right!):

HTTP/1.1 301 Moved Permanently
Cache-Control: private
Content-Length: 21
Content-Type: text/plain; charset=utf-8
Location: https://httpstat.us

很遗憾,Java 的 HttpURLConnection 不遵循重定向!

请注意,如果您将原始 URL 更改为 HTTPS (https://httpstat.us/301),Java 按预期遵循重定向!?

最佳答案

仅当它们使用相同的协议(protocol)时才会遵循重定向。 (参见源代码中的 the followRedirect() method。)无法禁用此检查。

尽管我们知道它反射(reflect)了 HTTP,但从 HTTP 协议(protocol)的角度来看,HTTPS 只是另一种完全不同的未知协议(protocol)。未经用户批准就跟随重定向是不安全的。

例如,假设应用程序设置为自动执行客户端身份验证。用户希望匿名上网,因为他使用的是 HTTP。但是,如果他的客户端在不询问的情况下使用 HTTPS,他的身份就会暴露给服务器。

关于java - HTTPURLConnection 不遵循从 HTTP 到 HTTPS 的重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1884230/

相关文章:

ssl - mosquitto_pub 拒绝 iot.eclipse.org mqtt 服务器证书说 "Unknown CA"

java - 启动 tomcat 时未正确定义 jre_home 环境变量

php - Laravel - 测试重定向后会发生什么

.htaccess ModRewrite 带 2 个参数

node.js - NGINX:将所有请求重定向到我的本地主机端口到 https/SSL

django - SSL 安装后 Gunicorn 工作线程超时(Django、Nginx)

java - 无法在 Neo4j 中导入超过 10000 个节点

java - Action 监听器错误

java - 如何部署混合 C++/Java (JNI) 应用程序?

apache - 使用 htaccess 将安全域重定向到安全子域