为了账号安全,请及时绑定邮箱和手机立即绑定

URLConnection不遵循重定向

URLConnection不遵循重定向

有只小跳蛙 2019-07-10 16:48:08
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>
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

我不认为它会自动地从HTTP重定向到HTTPS(反之亦然)。

尽管我们知道HTTPS反映了HTTP,但从HTTP协议的角度来看,HTTPS只是其他一些完全不同的未知协议。在没有用户批准的情况下遵循重定向是不安全的。

例如,假设应用程序被设置为自动执行客户端身份验证。用户希望匿名浏览,因为他使用的是HTTP。但是,如果他的客户不经询问就跟踪HTTPS,那么他的身份就会透露给服务器。


查看完整回答
反对 回复 2019-07-10
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

HttpURL连接设计不会自动从HTTP重定向到HTTPS(反之亦然)。跟踪重定向可能会造成严重的安全后果。SSL(因此HTTPS)创建了一个对用户是唯一的会话。此会话可用于多个请求。因此,服务器可以跟踪来自单个人的所有请求。这是一种脆弱的身份形式,是可以利用的。此外,SSL握手可以请求客户端的证书。如果发送到服务器,则将客户端的标识交给服务器。

埃里克森指出,假设应用程序被设置为自动执行客户端身份验证。用户希望匿名浏览,因为他使用的是HTTP。但是,如果他的客户不经询问就跟踪HTTPS,那么他的身份就会透露给服务器。

程序员必须采取额外步骤,确保在从HTTP重定向到HTTPS之前不会发送凭据、客户端证书或SSL会话id。默认情况是发送这些。如果重定向伤害了用户,请不要遵循重定向。这就是为什么不支持自动重定向。

有了这个理解,下面是重定向之后的代码。

  URL resourceUrl, base, next;
  Map<String, Integer> visited;
  HttpURLConnection conn;
  String location;
  int times;

  ...
  visited = new HashMap<>();

  while (true)
  {
     times = visited.compute(url, (key, count) -> count == null ? 1 : count + 1);

     if (times > 3)
        throw new IOException("Stuck in redirect loop");

     resourceUrl = new URL(url);
     conn        = (HttpURLConnection) resourceUrl.openConnection();

     conn.setConnectTimeout(15000);
     conn.setReadTimeout(15000);
     conn.setInstanceFollowRedirects(false);   // Make the logic below easier to detect redirections
     conn.setRequestProperty("User-Agent", "Mozilla/5.0...");

     switch (conn.getResponseCode())
     {
        case HttpURLConnection.HTTP_MOVED_PERM:
        case HttpURLConnection.HTTP_MOVED_TEMP:
           location = conn.getHeaderField("Location");
           location = URLDecoder.decode(location, "UTF-8");
           base     = new URL(url);               
           next     = new URL(base, location);  // Deal with relative URLs
           url      = next.toExternalForm();
           continue;
     }

     break;
  }

  is = conn.openStream();
  ...


查看完整回答
反对 回复 2019-07-10
?
largeQ

TA贡献2039条经验 获得超7个赞

有一种叫HttpURLConnection.setFollowRedirects(false)有可能吗?

你可以随时打电话

conn.setInstanceFollowRedirects(true);

如果你想确保你不影响应用的其他行为。


查看完整回答
反对 回复 2019-07-10
  • 3 回答
  • 0 关注
  • 884 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信