Class Ips

java.lang.Object
tech.riemann.nif.utils.Ips

public class Ips extends Object
IP工具类,提供IP地址相关的工具方法
Author:
Kerbores(kerbores@riemann.tech)
  • Constructor Summary

    Constructors
    Constructor
    Description
    Ips()
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static String
    getIP(jakarta.servlet.http.HttpServletRequest request)
    获取客户端IP地址(secure-by-default)。
    static String
    获取主机的IPv4地址 遍历所有网络接口,并查找IPv4地址 如果找到IPv4地址,则返回该地址;否则,返回null
    static boolean
    internalIp(byte[] addr)
    判断给定的IP地址是否为内部IP地址 内部IP地址指的是私有网络中使用的IP地址,这些IP地址不会在互联网中路由 该方法通过检查IP地址的前两个字节来判断其是否属于私有地址范围
    static boolean
    判断给定的IP地址是否为内部IP地址
    static long
    将IPv4地址转换为长整型
    static long[]
    将 IPv6 地址字符串转换为两个 long 值 此方法用于处理 IPv6 地址,将其转换为更容易处理的 long 值形式每个 IPv6 地址由 8 个 16 进制块组成, 每个块代表 16 位此方法将这些块组合成两个 long 值,每个值包含 4 个块
    static boolean
    isInRange(String ip, String cidr)
    判断一个IP地址是否在给定的CIDR地址范围内
    static String
    longs2Ipv6(long[] longs)
    将长整型数组转换为IPv6地址字符串 此方法接受一个包含两个长整型的数组,每个长整型表示IPv6地址的四组16位无符号整数 这些数字按照数组中的顺序串联起来,每组数字之间用冒号分隔,形成完整的IPv6地址
    static String
    longToIPV4(long longIp)
    将长整型IP地址转换为IPv4字符串格式
    static byte[]
    将文本格式的IPv4地址转换为数值格式的字节数组

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • Ips

      public Ips()
  • Method Details

    • getIP

      public static String getIP(jakarta.servlet.http.HttpServletRequest request)
      获取客户端IP地址(secure-by-default)。

      委托 ClientIpResolver.secure():默认不采信 X-Forwarded-For 等转发头, 一律返回直连地址 HttpServletRequest#getRemoteAddr()——这是唯一客户端无法伪造的地址。 需要信任反向代理时,请直接使用 ClientIpResolver 并显式配置 trustForwardedHeader 与 trustedProxies,不要依赖本方法的隐式行为。

      Parameters:
      request - HttpServletRequest对象,通过它来获取IP地址
      Returns:
      客户端的IP地址字符串;获取失败或地址无效时返回空字符串
      Throws:
      IllegalArgumentException - 当 request 为 null
    • internalIp

      public static boolean internalIp(String ip)
      判断给定的IP地址是否为内部IP地址
      Parameters:
      ip - 字符串格式的IP地址
      Returns:
      如果IP地址为内部IP,则返回true;否则返回false
    • textToNumericFormatV4

      public static byte[] textToNumericFormatV4(String src)
      将文本格式的IPv4地址转换为数值格式的字节数组
      Parameters:
      src - 文本格式的IPv4地址字符串
      Returns:
      数值格式的IPv4地址对应的字节数组,如果转换失败或输入非法,则返回空数组
    • internalIp

      public static boolean internalIp(byte[] addr)
      判断给定的IP地址是否为内部IP地址 内部IP地址指的是私有网络中使用的IP地址,这些IP地址不会在互联网中路由 该方法通过检查IP地址的前两个字节来判断其是否属于私有地址范围
      Parameters:
      addr - 一个包含IP地址的字节数组,该IP地址需要是4字节的IPv4地址
      Returns:
      如果给定的IP地址是内部IP地址,则返回true;否则返回false

      M21: 空数组/长度不足 4 返回 false(原实现 addr[0] 越界抛异常)

    • hostIp

      public static String hostIp()
      获取主机的IPv4地址 遍历所有网络接口,并查找IPv4地址 如果找到IPv4地址,则返回该地址;否则,返回null
      Returns:
      返回主机的IPv4地址字符串,如果获取失败则返回null
    • ipV4ToLong

      public static long ipV4ToLong(String ipv4)
      将IPv4地址转换为长整型
      Parameters:
      ipv4 - IPv4地址字符串,格式为"xxx.xxx.xxx.xxx"
      Returns:
      对应的长整型数值
    • longToIPV4

      public static String longToIPV4(long longIp)
      将长整型IP地址转换为IPv4字符串格式
      Parameters:
      longIp - 长整型IP地址
      Returns:
      转换后的IPv4字符串格式
    • ipv6ToLongs

      public static long[] ipv6ToLongs(String ipv6)
      将 IPv6 地址字符串转换为两个 long 值 此方法用于处理 IPv6 地址,将其转换为更容易处理的 long 值形式每个 IPv6 地址由 8 个 16 进制块组成, 每个块代表 16 位此方法将这些块组合成两个 long 值,每个值包含 4 个块
      Parameters:
      ipv6 - IPv6 地址字符串
      Returns:
      包含两个 long 值的数组,这两个值表示输入的 IPv6 地址
      Throws:
      IllegalArgumentException - 如果输入字符串不是有效的 IPv6 地址或为 null
    • longs2Ipv6

      public static String longs2Ipv6(long[] longs)
      将长整型数组转换为IPv6地址字符串 此方法接受一个包含两个长整型的数组,每个长整型表示IPv6地址的四组16位无符号整数 这些数字按照数组中的顺序串联起来,每组数字之间用冒号分隔,形成完整的IPv6地址
      Parameters:
      longs - 包含两个元素的长整型数组,每个元素表示IPv6地址的一半
      Returns:
      转换后的IPv6地址字符串
      Throws:
      IllegalArgumentException - 如果输入的数组为null或长度不为2,抛出此异常
    • isInRange

      public static boolean isInRange(String ip, String cidr)
      判断一个IP地址是否在给定的CIDR地址范围内

      支持 IPv4 与 IPv6。关键契约变更(修复 IPv6 导致白名单 Filter 500 的问题):

      • 不再对"不支持/非同族/格式非法"的输入抛异常,而是返回 false—— 白名单语义是"不在范围内即拒绝(401)",因此 IPv6 客户端访问 IPv4 白名单、 或 IP/CIDR 格式非法时,应正确地判定为"不在白名单"而非让 Filter 崩溃成 500。
      • IP 与 CIDR 必须同族(同为 IPv4 或同为 IPv6)才比较,否则返回 false。
      • CIDR 前缀长度越界(IPv4 >32 / IPv6 >128)时返回 false。
      Parameters:
      ip - 一个 IP 地址,例如 "192.168.1.100" 或 "2001:db8::1"
      cidr - 一个 CIDR 地址范围,例如 "192.168.1.0/24" 或 "2001:db8::/32"
      Returns:
      如果IP地址在CIDR范围内返回true,否则返回false