我如何检查IP地址是否属于私人类别?
if(isPrivateIPAddress(ipAddress)) {
//do something
}
任何建议都将受到赞赏。
更新的答案
private static boolean isPrivateIPAddress(String ipAddress) {
InetAddress ia = null;
try {
InetAddress ad = InetAddress.getByName(ipAddress);
byte[] ip = ad.getAddress();
ia = InetAddress.getByAddress(ip);
} catch (UnknownHostException e) {
e.printStackTrace();
}
return ia.isSiteLocalAddress();
}
我写了这个方法,它对我来说很好。但有没有这种方法不起作用的情况?我只是想确保它适用于每一个案例。
答案 0 :(得分:17)
修改:正确的方法是InetAddress.isSiteLocalAddress()。
检查InetAddress是否是站点本地地址的实用程序例程。
返回:一个布尔值,指示InetAddress是否是本地站点 地址;如果地址不是站点本地单播地址,则返回false。
请参阅讨论的评论。
答案 1 :(得分:4)
首先,专用网络可以在以下范围内的任何地方使用IPv4地址:
我们可以从Inet4Address.java中的方法isSiteLocalAddress看到:
public boolean isSiteLocalAddress() {
// refer to RFC 1918
// 10/8 prefix
// 172.16/12 prefix
// 192.168/16 prefix
int address = holder().getAddress();
return (((address >>> 24) & 0xFF) == 10)
|| ((((address >>> 24) & 0xFF) == 172)
&& (((address >>> 16) & 0xF0) == 16))
|| ((((address >>> 24) & 0xFF) == 192)
&& (((address >>> 16) & 0xFF) == 168));
}
情况b)172.16.0.0 - 172.31.255.255(1,048,576个IP地址)不满足。但你可以很容易地写出你自己的版本,告诉你地址是否是私人地址。这是我的版本:
import com.google.common.net.InetAddresses;
private static boolean isPrivateV4Address(String ip) {
int address = InetAddresses.coerceToInteger(InetAddresses.forString(ip));
return (((address >>> 24) & 0xFF) == 10)
|| ((((address >>> 24) & 0xFF) == 172)
&& ((address >>> 16) & 0xFF) >= 16
&& ((address >>> 16) & 0xFF) <= 31)
|| ((((address >>> 24) & 0xFF) == 192)
&& (((address >>> 16) & 0xFF) == 168));
}
答案 2 :(得分:3)
这是我为测试自己的地址而生成的快速黑客攻击。
import java.net.InetAddress;
import java.net.UnknownHostException;
public class LocalAddress {
public static void main(String[] args) {
InetAddress address = null;
try {
address = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
if (address.isSiteLocalAddress()) {
System.out.println("Site Local Address: " + address.getHostAddress());
} else {
System.out.println("Routeable Address: " + address.getHostAddress());
}
}
}
编辑:此代码尚未针对链接本地地址,localhost或为文档保留的地址块进行测试。前两种情况有返回它们的方法。最后一个未在类的文档中引用。
答案 3 :(得分:0)
我用这个:
public boolean isPrivateIP(String ipAddress) {
boolean isValid = false;
if (ipAddress != null && !ipAddress.isEmpty()) {
String[] ip = ipAddress.split("\\.");
short[] ipNumber = new short[] {
Short.parseShort(ip[0]),
Short.parseShort(ip[1]),
Short.parseShort(ip[2]),
Short.parseShort(ip[3])
};
if (ipNumber[0] == 10) { // Class A
isValid = true;
} else if (ipNumber[0] == 172 && (ipNumber[1] >= 16 && ipNumber[1] <= 31)) { // Class B
isValid = true;
} else if (ipNumber[0] == 192 && ipNumber[1] == 168) { // Class C
isValid = true;
}
}
return isValid;
}