当前位置: 首页 > 面试题库 >

Java HTTPURLConnection不跟随从HTTP重定向到HTTPS

栾鸣
2023-03-14
问题内容

我不明白为什么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

对http://httpstat.us/301的请求返回以下(缩短的)响应(这似乎绝对正确!):

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不遵循重定向!


问题答案:

仅当重定向使用相同的协议时,才遵循重定向。(请参见源代码中的followRedirect()方法。)无法禁用此检查。

即使我们知道它是HTTP的镜像,但从HTTP协议的角度来看,HTTPS还是其他完全不同的未知协议。未经用户批准而进行重定向是不安全的。

例如,假设将应用程序设置为自动执行客户端身份验证。用户期望匿名访问,因为他正在使用HTTP。但是,如果他的客户不经询问就遵循HTTPS,则他的身份将显示给服务器。



 类似资料:
  • 我的服务器正在从http重定向到HTTPS。我希望允许使用http和HTTPS访问我的应用程序。我怎么能这么做?在我的Wildfly8.2日志中有这样两行:

  • 奇怪的问题。我使用FullCalendar向服务器上的endpoint发起ajax请求。终点是: 请注意,它是显式的HTTPS。但是,当我发起一个请求时(即当Fullcalendar发起一个请求时),我会得到一个301和一个到非HTTPSendpoint的重定向: 因为页面是通过HTTPS加载的,所以失败。 endpoint工作正常--当我将它加载到浏览器中时,我会得到预期的json输出(通过ht

  • 问题内容: 我目前正在用Go语言编写一些与REST API交互的软件。我正在尝试查询的REST API端点返回HTTP 302重定向以及HTTP Location标头,指向资源URI。 我正在尝试使用Go脚本抓取HTTP Location标头,以供以后处理。 这是我目前为实现此功能正在做的事情: 对我来说,这有点像是个骇客。通过覆盖的功能,我实际上被迫将HTTP重定向视为错误(不是)。 我已经看到

  • RewriteCond%{SERVER\u PORT}上的RewriteEngine!443重写规则^(/(.*)?$https://%{HTTP_HOST}/$1[R=301,L] 这是我在. htaccess文件中使用的命令,当我键入arion-software.co.uk它不能正确重定向。任何想法?

  • 我正在尝试将所有http流量的重定向配置为仅重定向到https。我的配置如下 我们使用的是弹性负载均衡和 EC2 实例 在这种情况下,已配置应用程序负载均衡器。 后端服务器正在使用 Nginx 在端口 443 上工作 为 http 到 https 重定向配置了 Nginx 重定向规则 为端口 80 和 443 配置了 ELB 侦听器 在支持的服务器和 ELB 中都安装了 SSL 证书 我的问题是,

  • 问题内容: 我正在一个购物车网站上工作,我想在用户输入帐单明细时将用户重定向到HTTPS页面,并保持下一页的HTTPS连接,直到他注销。 为此,我需要在服务器上安装什么(我正在使用Apache),如何从PHP进行重定向? 问题答案: 尝试这样的事情(应该适用于Apache和IIS):