使用 Java 开发兼容 IPv6 的网络应用程序
2010-06-08 00:00:00 来源:WEB开发网由于 IPv6 协议所允许的网络地址格式较多,规范较宽松(例如零压缩地址,IPv4 映射地址等),所以导致了 IPv6 网络地址的格式变化很大。
Java 对于 IPv6 网络地址的验证是通过对输入字符的循环匹配做到的,并没有采取正则表达式的做法。其匹配过程中还依赖于其它的 Java 方法。
目前网络上流传的 IPv6 网络地址验证的正则表达式通常都只能涵盖部分地址格式,而且表达式冗长难读,非常不易于理解。
基于通用性考虑,以及为了使验证方法尽量简单易读,笔者尝试将 IPv6 网络地址的格式简单分类以后,使用多个正则表达式进行验证。
这种做法兼顾了通用性(基于正则表达式,所以方便用各种不同的编程语言进行实现),以及易读性(每个独立的正则表达式相对简短);并且根据测试,支持目前所有的 IPv6 网络地址格式类型,尚未发现例外。
以下是笔者用 Java 编写的对于 IPv6 网络地址的验证方法。此算法可被简单地用其它编程语言仿照重写。
清单 1. 验证地址
//IPv6 address validator matches these IPv6 formats
//::ffff:21:7.8.9.221 | 2001:0db8:85a3:08d3:1319:8a2e:0370:7344
//| ::8a2e:0:0370:7344 | 2001:0db8:85a3:08d3:1319:8a2e:100.22.44.55
//| 2001:0db8::8a2e:100.22.44.55 | ::100.22.44.55 | ffff::
//And such addresses are invalid
//::8a2e:0:0370:7344.4 | 2001:idb8::111:7.8.9.111 | 2001::100.a2.44.55
//| :2001::100.22.44.55
public static boolean isIPV6Format(String ip) {
ip = ip.trim();
//in many cases such as URLs, IPv6 addresses are wrapped by []
if(ip.substring(0, 1).equals("[") && ip.substring(ip.length()-1).equals("]"))
ip = ip.substring(1, ip.length()-1);
return (1 < Pattern.compile(":").split(ip).length)
//a valid IPv6 address should contains no less than 1,
//and no more than 7 “:” as separators
&& (Pattern.compile(":").split(ip).length <= 8)
//the address can be compressed, but “::” can appear only once
&& (Pattern.compile("::").split(ip).length <= 2)
//if a compressed address
&& (Pattern.compile("::").split(ip).length == 2)
//if starts with “::” – leading zeros are compressed
? (((ip.substring(0, 2).equals("::"))
? Pattern.matches("^::([\\da-f]{1,4}(:)){0,4}(([\\da-f]{1,4}(:)[\\da-f]{1,4})
|([\\da-f]{1,4})|((\\d{1,3}.){3}\\d{1,3}))", ip)
: Pattern.matches("^([\\da-f]{1,4}(:|::)){1,5}
(([\\da-f]{1,4}(:|::)[\\da-f]{1,4})|([\\da-f]{1,4})
|((\\d{1,3}.){3}\\d{1,3}))", ip)))
//if ends with "::" - ending zeros are compressed
: ((ip.substring(ip.length()-2).equals("::"))
? Pattern.matches("^([\\da-f]{1,4}(:|::)){1,7}", ip)
: Pattern.matches("^([\\da-f]{1,4}:){6}(([\\da-f]{1,4}
:[\\da-f]{1,4})|((\\d{1,3}.){3}\\d{1,3}))", ip));
}}
更多精彩
赞助商链接