Java - Как определить версию IP
Я получаю IP-адрес Client
с помощью метода ниже:
public static String getClientIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
...
return ip
}
Теперь я хочу определить, является ли это IPV4
или IPV6
.
Ответы
Ответ 1
Вы можете создать InetAddress и проверить, стал ли он экземпляром ipv4 или ipv6
InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
// It ipv6
} else if (address instanceof Inet4Address) {
// It ipv4
}
Кажется, это немного неудобно, и я надеюсь, что есть лучшее решение.
Ответ 2
Если вы уверены, что получаете IPv4 или IPv6, вы можете попробовать следующее. Если у вас есть DNS-имя, это попытается выполнить поиск. В любом случае, попробуйте следующее:
try {
InetAddress address = InetAddress.getByName(myIpAddr);
if (address instanceof Inet4Address) {
// your IP is IPv4
} else if (address instanceof Inet6Address) {
// your IP is IPv6
}
} catch(UnknownHostException e) {
// your address was a machine name like a DNS name, and couldn't be found
}
Ответ 3
Благодаря Tala.
Вот что я пробовал использовать этот пример с небольшими изменениями:
private static Pattern VALID_IPV4_PATTERN = null;
private static Pattern VALID_IPV6_PATTERN = null;
private static final String ipv4Pattern = "(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])";
private static final String ipv6Pattern = "([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}";
static {
try {
VALID_IPV4_PATTERN = Pattern.compile(ipv4Pattern, Pattern.CASE_INSENSITIVE);
VALID_IPV6_PATTERN = Pattern.compile(ipv6Pattern, Pattern.CASE_INSENSITIVE);
} catch (PatternSyntaxException e) {
//logger.severe("Unable to compile pattern", e);
}
}
public static String isIpAddressV4orV6(String ipAddress) {
Matcher ipv4 = IP_Utilities.VALID_IPV4_PATTERN.matcher(ipAddress);
if (ipv4.matches()) {
return "IPV4";
}
Matcher ipv6 = IP_Utilities.VALID_IPV6_PATTERN.matcher(ipAddress);
if (ipv6.matches()) {
return "IPV6";
}
return "";
}
Ответ 4
Вы можете использовать InetAddresses из google guava. Например, например:
int addressLength = InetAddresses.forString(ip).getAddress().length;
switch (addressLength) {
case 4:
System.out.println("IPv4");
break;
case 16:
System.out.println("IPv6");
break;
default:
throw new IllegalArgumentException("Incorrect ip address length " + addressLength);
}