URLConnection不遵循重定向

URLConnection不遵循重定向

我不明白为什么JavaHttpURLConnection不会跟随重定向。我使用以下代码来获取本页:

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 bitlyUrl = "http://bit.ly/4hW294";
            URL resourceUrl = new URL(bitlyUrl);
            HttpURLConnection conn = (HttpURLConnection)resourceUrl.openConnection();
            conn.setConnectTimeout(15000);
            conn.setReadTimeout(15000);
            conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.11)
             Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)");
            conn.connect();
            is = conn.getInputStream();
            String res = conn.getURL().toString();
            if (res.toLowerCase().contains("bit.ly"))
                System.out.println("bit.ly is after resolving: "+res);
       }
       catch (Exception e) {
           System.out.println("error happened: "+e.toString());
       }
       finally {
            if (is != null) is.close(); 
        }
    }}

此外,我得到了以下答复(这似乎是完全正确的!):

GET /4hW294 HTTP/1.1Host: bit.lyConnection: Keep-AliveUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru-RU; rv:1.9.1.3)
 Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)HTTP/1.1 301 MovedServer: nginx/0.7.42Date: Thu, 10 Dec 2009 20:28:44 GMTContent-Type: 
 text/html; charset=utf-8Connection: keep-aliveLocation: https://www.myganocafe.com/CafeMacyMIME-Version: 1.0Content-Length: 297

不幸的是,res变量包含相同的URL,流包含以下内容(显然,Java的HttpURLConnection不跟随重定向!):

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><HTML><HEAD><TITLE>Moved</TITLE></HEAD><BODY><H2>Moved</H2>
<A HREF="https://www.myganocafe.com/CafeMacy">The requested URL has moved here.</A><P ALIGN=RIGHT><SMALL>
<I>AOLserver/4.5.1 on http://127.0.0.1:7400</I></SMALL></P></BODY></HTML>


有只小跳蛙
浏览 885回答 3
3回答

蛊毒传说

我不认为它会自动地从HTTP重定向到HTTPS(反之亦然)。尽管我们知道HTTPS反映了HTTP,但从HTTP协议的角度来看,HTTPS只是其他一些完全不同的未知协议。在没有用户批准的情况下遵循重定向是不安全的。例如,假设应用程序被设置为自动执行客户端身份验证。用户希望匿名浏览,因为他使用的是HTTP。但是,如果他的客户不经询问就跟踪HTTPS,那么他的身份就会透露给服务器。

慕码人2483693

HttpURL连接设计不会自动从HTTP重定向到HTTPS(反之亦然)。跟踪重定向可能会造成严重的安全后果。SSL(因此HTTPS)创建了一个对用户是唯一的会话。此会话可用于多个请求。因此,服务器可以跟踪来自单个人的所有请求。这是一种脆弱的身份形式,是可以利用的。此外,SSL握手可以请求客户端的证书。如果发送到服务器,则将客户端的标识交给服务器。如埃里克森指出,假设应用程序被设置为自动执行客户端身份验证。用户希望匿名浏览,因为他使用的是HTTP。但是,如果他的客户不经询问就跟踪HTTPS,那么他的身份就会透露给服务器。程序员必须采取额外步骤,确保在从HTTP重定向到HTTPS之前不会发送凭据、客户端证书或SSL会话id。默认情况是发送这些。如果重定向伤害了用户,请不要遵循重定向。这就是为什么不支持自动重定向。有了这个理解,下面是重定向之后的代码。&nbsp;&nbsp;URL&nbsp;resourceUrl,&nbsp;base,&nbsp;next; &nbsp;&nbsp;Map<String,&nbsp;Integer>&nbsp;visited; &nbsp;&nbsp;HttpURLConnection&nbsp;conn; &nbsp;&nbsp;String&nbsp;location; &nbsp;&nbsp;int&nbsp;times; &nbsp;&nbsp;... &nbsp;&nbsp;visited&nbsp;=&nbsp;new&nbsp;HashMap<>(); &nbsp;&nbsp;while&nbsp;(true) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times&nbsp;=&nbsp;visited.compute(url,&nbsp;(key,&nbsp;count)&nbsp;->&nbsp;count&nbsp;==&nbsp;null&nbsp;?&nbsp;1&nbsp;:&nbsp;count&nbsp;+&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(times&nbsp;>&nbsp;3) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IOException("Stuck&nbsp;in&nbsp;redirect&nbsp;loop"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resourceUrl&nbsp;=&nbsp;new&nbsp;URL(url); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(HttpURLConnection)&nbsp;resourceUrl.openConnection(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setConnectTimeout(15000); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setReadTimeout(15000); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setInstanceFollowRedirects(false);&nbsp;&nbsp;&nbsp;//&nbsp;Make&nbsp;the&nbsp;logic&nbsp;below&nbsp;easier&nbsp;to&nbsp;detect&nbsp;redirections &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty("User-Agent",&nbsp;"Mozilla/5.0..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(conn.getResponseCode()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;HttpURLConnection.HTTP_MOVED_PERM: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;HttpURLConnection.HTTP_MOVED_TEMP: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location&nbsp;=&nbsp;conn.getHeaderField("Location"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location&nbsp;=&nbsp;URLDecoder.decode(location,&nbsp;"UTF-8"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;new&nbsp;URL(url);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;new&nbsp;URL(base,&nbsp;location);&nbsp;&nbsp;//&nbsp;Deal&nbsp;with&nbsp;relative&nbsp;URLs &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;next.toExternalForm(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;} &nbsp;&nbsp;is&nbsp;=&nbsp;conn.openStream(); &nbsp;&nbsp;...

largeQ

有一种叫HttpURLConnection.setFollowRedirects(false)有可能吗?你可以随时打电话conn.setInstanceFollowRedirects(true);如果你想确保你不影响应用的其他行为。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java