基于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
----------------------------------------------------

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

(0)

相关推荐

  • Java利用Request请求获取IP地址的方法详解

    前言 最近在项目中遇到一个需求,是需要将不同省份的用户,展示不同内容,通过查找相关的资料,发现可以通过Request请求获取IP地址,下面我们先来贴代码, 如果你要在生产环境使用就直接拿去用吧,我这边已经上线了. 示例代码 public class IpAdrressUtil { /** * 获取Ip地址 * @param request * @return */ private static String getIpAdrress(HttpServletRequest request) { S

  • 详解linux为阿里云ECS(CentOS7)配置IPv6地址

    环境为:ECS"经典网络"类型 步骤: 1. 编辑 /etc/sysctl.conf 文件,将其中三条禁用IPv6的设置更改为: net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 net.ipv6.conf.lo.disable_ipv6 = 0 2.再运行 sysctl -p 的命令,启用IPv6 3. 转到 tunnelbroker.net 网站,在 Example Configura

  • Java 获取Web项目相对webapp地址的实例

    实例如下: ServletRequestAttributes aRequestAttributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request =aRequestAttributes==null?null:aRequestAttributes.getRequest(); String webpath=request.getServletConte

  • Java编程IP地址和数字相互转换代码示例

    最近才知道,将ip地址转换成十进制.八进制.十六进制同样可以访问网站. IP转为数字(第二种算法.用左移.按位或实现.效率更高.): public long ipToLong(String ipAddress) { long result = 0; String[] ipAddressInArray = ipAddress.split("\\."); for (int i = 3; i >= 0; i--) { long ip = Long.parseLong(ipAddress

  • JAVA如何获取客户端IP地址和MAC地址

    本文介绍了JAVA如何获取客户端IP地址和MAC地址 ,分享给大家,具体如下: 1.获取客户端IP地址 public String getIp(HttpServletRequest request) throws Exception { String ip = request.getHeader("X-Forwarded-For"); if (ip != null) { if (!ip.isEmpty() && !"unKnown".equalsIg

  • Java使用正则表达式匹配获取链接地址的方法示例

    本文实例讲述了Java使用正则表达式匹配获取链接地址的方法.分享给大家供大家参考,具体如下: 获取页面中字符串的url地址我们都会使用正则表达式来匹配获取了,下面我来给大家总结几个匹配获取链接地址示例. 1.正则表达式中Matcher中find()方法的应用. 2.String对象中的 replaceAll(String regex,String replacement) 方法的使用.通过这个方法去除了不必要的字符串,从而得到了需要的网址和链接文字 例1.超简单的 String content

  • php获取用户IPv4或IPv6地址的代码

    其实这个很简单,只不过我一直想用 ipv6-test 的API做一个获取用户IP地址的东西--无奈JSON获取到的只是本机服务器的IP.算了,不研究了,何况人家提供的widget也挺好用的.谷歌了一下,找到这段代码,可以根据用户环境获取IP地址. 例如IPv6访问 www.shiwo.de 则获取到的是用户的IPv6地址 p.s 前提是网站做了A和AAAA解析 复制代码 代码如下: <?php function getIP() /*获取客户端IP*/ { if (@$_SERVER["HT

  • Java 根据网址查询DNS/IP地址的方法

    需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, 直接使用Java平台提供的API进行操作. DNS也就是 Domain Name Service,即 域名服务. 我们知道, Java中与网址有关的类包括 java.net.URL 和 java.net.URI 等, 其中 URI 是资源定位符, 可能包括 file: 之类的协议. 所以此处我们使用

  • Java利用Request请求如何获取IP地址对应的省份、城市详解

    前言 最近的一个项目中需要将不同省份的用户,展示不同内容,所以需要通过Request请求获取IP地址, 然后通过IP获取IP对应省份. 这里的操作步骤一共有步: 1. 通过Request获取IP 2. 通过IP获取对应省份.城市 3. 通过设置的省份和IP对应省份进行比对,展示内容 通过Request获取IP 可以参考我的另外一篇文章[Java 通过Request请求获取IP地址]下面是代码: public class IpAdrressUtil { /** * 获取Ip地址 * @param

  • java获取ip地址与网络接口的方法示例

    java.net包 大家应该都知道,网络相关对象在java.net包中,Java net包下的类如下: 1.获取主机对象InetAddress //获取本地主机对象 InetAddress host = InetAddress.getLocalHost(); //根据ip地址或主机名获取主机对象,以主机名获取主机时需要DNS解析 InetAddress host = InetAddress.getByName("192.168.100.124"); InetAddress host =

随机推荐