为假装URL地址抛出新的例外

时间:2013-03-17 22:26:20

标签: java url exception

我已经做了一些检索我输入的URL的IP地址的东西。

InetAddress ip = InetAddress.getByName("www.fake.cao");
return ia.getHostAddress();

我还抛出了UnknownHostException来尝试捕获错误的URL错误。

问题是,www.fake.cao被识别为真正的URL,并返回一个不可用的IP地址,并且不会抛出异常。

任何人都可以告诉我如何捕捉这些自命不凡的URL?

3 个答案:

答案 0 :(得分:2)

尝试打开地址的套接字,如果地址无效,将抛出异常。

答案 1 :(得分:1)

根据IP规范,地址0.0.0.0表示不可用,无效或未知的主机。如果您没有收到错误URL的例外,也许您可​​以检查IP地址。如果它是0.0.0.0,那么主机可能不存在。

如果从ISP获得一些通用的不存在地址,那么也许您可以尝试执行手动NS查找。基本上你必须重写InetAddress类中的整个代码。这将包括获取DNS服务器IP地址,打开它的套接字,发布NS查询并阅读解析响应。

如果您不是平台独立性,则可以使用JNI连接到平台DNS工具。例如,nslookup.exe用于Windows。

答案 2 :(得分:1)

问题是您的ISP会为不存在的DNS域返回虚假页面。 (坏)练习称为NXDOMAIN重定向。

JRE无法判断81.200.64.50www.fake.cao的实际IP地址,还是您的ISP注入的虚假页面。

除了实际尝试打开套接字并检查它是否连接之外(请注意,即使主机不存在,也可以连接,例如,如果您尝试打开HTTP连接),您可以比较该主机的返回IP,以及已知为无效主机的返回IP(例如does-not-exist.invalid)。

InetAddress ip = InetAddress.getByName("www.fake.cao");

InetAddress fake;
try {
   fake = InetAddress.getByName("does-not-exist.invalid");      
} catch (UnknownHostException e) {
   //www.fake.cao exists, but invalid does not
   return ip;
} 
if (Arrays.equals(ip.getAddress(),fake.getAddress())) {
    //both ip and fake resolves to the same IP
    throw new UnknownHostException();
}

//invalid does exist, but it is different from ip
return ip;

此方法尚未完成,因为您的ISP可能会为不同的不存在的主机返回不同的地址,但至少会尝试解决此问题。