HTTPURLConnection 的安全重定向问题
在 Java 中,HttpURLConnection 在执行从 HTTP 转换为 HTTPS URL 的 HTTP 重定向时会遇到困难。在某些情况下观察到的这种行为使寻求理解根本原因的开发人员感到困惑。
为了说明该问题,请考虑以下代码片段:
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(); } } }
当使用初始 URL 设置为“http://httpstat.us/301”,输出显示 Java 的 HttpURLConnection 不遵循重定向到“https://httpstat.us。”
理解行为
此行为的解释在于 Java 处理重定向的方式。默认情况下,仅当它们使用相同协议时才会遵循重定向。此限制是在 followRedirect() 方法中实现的。
需要注意的是,HTTPS 虽然模仿 HTTP,但从协议角度来看,被视为与 HTTP 不同的协议。因此,Java 需要用户批准才能遵循从 HTTP 到 HTTPS 的重定向。为了防止潜在的安全问题,此预防措施是必要的。
例如,如果客户端在使用 HTTP 进行匿名浏览时配置为自动客户端身份验证,则在未经用户明确同意的情况下执行 HTTPS 重定向将会泄露客户端的身份服务器。
以上是为什么 Java 的 HttpURLConnection 默认不遵循 HTTP 到 HTTPS 重定向?的详细内容。更多信息请关注PHP中文网其他相关文章!