基于Java检查IPv6地址的合法性

 更新时间:2020年01月14日 09:30:32   作者:龙凌云端  
这篇文章主要介绍了基于Java检查IPv6地址的合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了基于Java检查IPv6地址的合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

由于IPv4资源即将耗尽,IPv6将要正式启用,这是大势所趋。

一些现有的服务和应用逐步要对IPv6支持,目前还处在过渡阶段。

提前了解一些IPv6的知识,还是有必要的。

如何判断一个IP地址,是否为IPv6地址呢?

以下代码是用Java实现的,用于校验IPv6地址合法性。

代码如下:

import java.text.Normalizer;
import java.text.Normalizer.Form;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IPV6Check {
 
  public static void main(String[] args) {
    String ipv6_1 = "2019:db8:a583:64:c68c:d6df:600c:ee9a";
    String ipv6_2 = "2019:db8:a583::9e42:be55:53a7";
    String ipv6_3 = "2019:db8:a583:::9e42:be55:53a7";
    String ipv6_4 = "1:2:3:4:5::192.168.254.254";
    String ipv6_5 = "ABCD:910A:2222:5498:8475:1111:3900:2020";
    String ipv6_6 = "1030::C9B4:FF12:48AA:1A2B";
    String ipv6_7 = "2019:0:0:0:0:0:0:1";
    String ipv6_8 = "::0:0:0:0:0:0:1";
    String ipv6_9 = "2019:0:0:0:0::";
    String ipv6_10= "2048:877e:31::7";

    String resultLine = "\n==> ";
    String splitLine = "\n----------------------------------------------------\n";
    System.out.println(ipv6_1 + resultLine + isValidIpv6Addr(ipv6_1) + splitLine);
    System.out.println(ipv6_2 + resultLine + isValidIpv6Addr(ipv6_2) + splitLine);
    System.out.println(ipv6_3 + resultLine + isValidIpv6Addr(ipv6_3) + splitLine);
    System.out.println(ipv6_4 + resultLine + isValidIpv6Addr(ipv6_4) + splitLine);
    System.out.println(ipv6_5 + resultLine + isValidIpv6Addr(ipv6_5) + splitLine);
    System.out.println(ipv6_6 + resultLine + isValidIpv6Addr(ipv6_6) + splitLine);
    System.out.println(ipv6_7 + resultLine + isValidIpv6Addr(ipv6_7) + splitLine);
    System.out.println(ipv6_8 + resultLine + isValidIpv6Addr(ipv6_8) + splitLine);
    System.out.println(ipv6_9 + resultLine + isValidIpv6Addr(ipv6_9) + splitLine);
    System.out.println(ipv6_10 + resultLine + isValidIpv6Addr(ipv6_10) + splitLine);
  }

  /**
   * 校验IPv6地址的合法性
   * @param ipAddr
   * @return
   */
  public static boolean isValidIpv6Addr(String ipAddr) {
 
    String regex = "(^((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4}){1}|:))"
        + "|(([0-9A-Fa-f]{1,4}:){6}((:[0-9A-Fa-f]{1,4}){1}|"
        + "((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
        + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
        + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
        + "(([0-9A-Fa-f]{1,4}:){5}((:[0-9A-Fa-f]{1,4}){1,2}|"
        + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
        + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
        + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
        + "(([0-9A-Fa-f]{1,4}:){4}((:[0-9A-Fa-f]{1,4}){1,3}"
        + "|:((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
        + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|"
        + "([0-9]){1,2})){3})|:))|(([0-9A-Fa-f]{1,4}:){3}((:[0-9A-Fa-f]{1,4}){1,4}|"
        + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
        + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
        + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
        + "(([0-9A-Fa-f]{1,4}:){2}((:[0-9A-Fa-f]{1,4}){1,5}|"
        + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
        + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
        + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))"
        + "|(([0-9A-Fa-f]{1,4}:){1}((:[0-9A-Fa-f]{1,4}){1,6}"
        + "|:((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
        + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
        + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
        + "(:((:[0-9A-Fa-f]{1,4}){1,7}|(:[fF]{4}){0,1}:((22[0-3]|2[0-1][0-9]|"
        + "[0-1][0-9][0-9]|([0-9]){1,2})"
        + "([.](25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|([0-9]){1,2})){3})|:)))$)";
 
    if (ipAddr == null) {
      System.out.println("IPv6 address is null ");
      return false;
    }
    ipAddr = Normalizer.normalize(ipAddr, Form.NFKC);
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(ipAddr);
 
    boolean match = matcher.matches();
    if (!match) {
       System.out.println("Invalid IPv6 address = " + ipAddr);
    }
 
    return match;
  }
 
}

运行结果如下:

2019:db8:a583:64:c68c:d6df:600c:ee9a
==> true
----------------------------------------------------

2019:db8:a583::9e42:be55:53a7
==> true
----------------------------------------------------

Invalid IPv6 address = 2019:db8:a583:::9e42:be55:53a7
2019:db8:a583:::9e42:be55:53a7
==> false
----------------------------------------------------

1:2:3:4:5::192.168.254.254
==> true
----------------------------------------------------

ABCD:910A:2222:5498:8475:1111:3900:2020
==> true
----------------------------------------------------

1030::C9B4:FF12:48AA:1A2B
==> true
----------------------------------------------------

2019:0:0:0:0:0:0:1
==> true
----------------------------------------------------

::0:0:0:0:0:0:1
==> true
----------------------------------------------------

2019:0:0:0:0::
==> true
----------------------------------------------------

2048:877e:31::7
==> true
----------------------------------------------------

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中的Semaphore如何使用

    Java中的Semaphore如何使用

    Semaphore实际上是一种共享锁,因为它允许多个线程并发获取共享的资源,在Semaphore对象创建时必须设置可用令牌的初始数量permits,用于控制并发时同时获取资源权限的线程数量,这篇文章主要介绍了Java中的Semaphore如何使用,需要的朋友可以参考下
    2022-06-06
  • Javax Validation自定义注解进行身份证号校验

    Javax Validation自定义注解进行身份证号校验

    这篇文章主要为大家详细介绍了如何通过Javax Validation自定义注解进行身份证号校验,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2024-10-10
  • Java设计模式之代理模式解析

    Java设计模式之代理模式解析

    这篇文章主要介绍了Java设计模式之代理模式解析,代理模式为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,需要的朋友可以参考下
    2023-12-12
  • java 面向对象代码块及不同位置对属性赋值的执行顺序

    java 面向对象代码块及不同位置对属性赋值的执行顺序

    这篇文章主要介绍了java面向对象代码块及不同位置对属性赋值的执行顺序,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • tomcat connection-timeout连接超时源码解析

    tomcat connection-timeout连接超时源码解析

    这篇文章主要为大家介绍了tomcat connection-timeout连接超时源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • java代码获取UUID的实现示例

    java代码获取UUID的实现示例

    本文主要介绍了java代码获取UUID的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java dom4j解析xml用到的几个方法

    java dom4j解析xml用到的几个方法

    这篇文章主要介绍了java dom4j解析xml用到的几个方法,有需要的朋友可以参考一下
    2013-12-12
  • 浅谈Java并发编程之Lock锁和条件变量

    浅谈Java并发编程之Lock锁和条件变量

    这篇文章主要介绍了浅谈Java并发编程之Lock锁和条件变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Spring P标签的使用详解

    Spring P标签的使用详解

    这篇文章主要介绍了Spring P标签的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • maven项目无法读取到resource文件夹的问题

    maven项目无法读取到resource文件夹的问题

    这篇文章主要介绍了maven项目无法读取到resource文件夹的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论