Class Ips
java.lang.Object
tech.riemann.nif.utils.Ips
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic StringgetIP(jakarta.servlet.http.HttpServletRequest request) 获取客户端IP地址(secure-by-default)。static StringhostIp()获取主机的IPv4地址 遍历所有网络接口,并查找IPv4地址 如果找到IPv4地址,则返回该地址;否则,返回nullstatic booleaninternalIp(byte[] addr) 判断给定的IP地址是否为内部IP地址 内部IP地址指的是私有网络中使用的IP地址,这些IP地址不会在互联网中路由 该方法通过检查IP地址的前两个字节来判断其是否属于私有地址范围static booleaninternalIp(String ip) 判断给定的IP地址是否为内部IP地址static longipV4ToLong(String ipv4) 将IPv4地址转换为长整型static long[]ipv6ToLongs(String ipv6) 将 IPv6 地址字符串转换为两个 long 值 此方法用于处理 IPv6 地址,将其转换为更容易处理的 long 值形式每个 IPv6 地址由 8 个 16 进制块组成, 每个块代表 16 位此方法将这些块组合成两个 long 值,每个值包含 4 个块static boolean判断一个IP地址是否在给定的CIDR地址范围内static Stringlongs2Ipv6(long[] longs) 将长整型数组转换为IPv6地址字符串 此方法接受一个包含两个长整型的数组,每个长整型表示IPv6地址的四组16位无符号整数 这些数字按照数组中的顺序串联起来,每组数字之间用冒号分隔,形成完整的IPv6地址static StringlongToIPV4(long longIp) 将长整型IP地址转换为IPv4字符串格式static byte[]将文本格式的IPv4地址转换为数值格式的字节数组
-
Constructor Details
-
Ips
public Ips()
-
-
Method Details
-
getIP
获取客户端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
判断给定的IP地址是否为内部IP地址- Parameters:
ip- 字符串格式的IP地址- Returns:
- 如果IP地址为内部IP,则返回true;否则返回false
-
textToNumericFormatV4
将文本格式的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
获取主机的IPv4地址 遍历所有网络接口,并查找IPv4地址 如果找到IPv4地址,则返回该地址;否则,返回null- Returns:
- 返回主机的IPv4地址字符串,如果获取失败则返回null
-
ipV4ToLong
将IPv4地址转换为长整型- Parameters:
ipv4- IPv4地址字符串,格式为"xxx.xxx.xxx.xxx"- Returns:
- 对应的长整型数值
-
longToIPV4
将长整型IP地址转换为IPv4字符串格式- Parameters:
longIp- 长整型IP地址- Returns:
- 转换后的IPv4字符串格式
-
ipv6ToLongs
将 IPv6 地址字符串转换为两个 long 值 此方法用于处理 IPv6 地址,将其转换为更容易处理的 long 值形式每个 IPv6 地址由 8 个 16 进制块组成, 每个块代表 16 位此方法将这些块组合成两个 long 值,每个值包含 4 个块- Parameters:
ipv6- IPv6 地址字符串- Returns:
- 包含两个 long 值的数组,这两个值表示输入的 IPv6 地址
- Throws:
IllegalArgumentException- 如果输入字符串不是有效的 IPv6 地址或为 null
-
longs2Ipv6
将长整型数组转换为IPv6地址字符串 此方法接受一个包含两个长整型的数组,每个长整型表示IPv6地址的四组16位无符号整数 这些数字按照数组中的顺序串联起来,每组数字之间用冒号分隔,形成完整的IPv6地址- Parameters:
longs- 包含两个元素的长整型数组,每个元素表示IPv6地址的一半- Returns:
- 转换后的IPv6地址字符串
- Throws:
IllegalArgumentException- 如果输入的数组为null或长度不为2,抛出此异常
-
isInRange
判断一个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
- 不再对"不支持/非同族/格式非法"的输入抛异常,而是返回
-