All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.hugh.components.IpResolver Maven / Gradle / Ivy

There is a newer version: 2.7.14
Show newest version
package com.github.hugh.components;

import com.github.hugh.bean.dto.Ip2regionDTO;
import com.github.hugh.exception.ToolboxException;
import com.github.hugh.util.ip.Ip2regionUtils;

/**
 * 提供 IP 地址解析功能的工具类。
 *
 * @since 2.7.5
 */
public class IpResolver {

    private String ip; // 要解析的 IP 地址
    private byte[] ipData; // IP 数据源
    private String spare; // 分隔符

    private static final String DEFAULT_NULL_STR = "0";
    private static final String DEFAULT_SPARE_CHAR = "\\|";

    /**
     * 构造函数,初始化要解析的 IP 地址。
     *
     * @param ip 要解析的 IP 地址
     */
    public IpResolver(String ip) {
        this.ip = ip;
    }

    /**
     * 构造函数,初始化要解析的 IP 地址和 IP 数据源。
     *
     * @param ip    要解析的 IP 地址
     * @param bytes IP 数据源
     */
    public IpResolver(String ip, byte[] bytes) {
        this.ip = ip;
        this.ipData = bytes;
    }

    /**
     * 静态工厂方法,创建一个新的 IpResolver 对象并初始化要解析的 IP 地址。
     *
     * @param ip 要解析的 IP 地址
     * @return 初始化了要解析的 IP 地址的 IpResolver 对象
     */
    public static IpResolver on(String ip) {
        return new IpResolver(ip);
    }

    /**
     * 静态工厂方法,创建一个新的 IpResolver 对象并初始化要解析的 IP 地址和 IP 数据源。
     *
     * @param ip    要解析的 IP 地址
     * @param bytes IP 数据源
     * @return 初始化了要解析的 IP 地址和 IP 数据源的 IpResolver 对象
     */
    public static IpResolver on(String ip, byte[] bytes) {
        return new IpResolver(ip, bytes);
    }

    /**
     * 设置分隔符。
     *
     * @param spare 分隔符
     * @return 当前 IpResolver 对象,用于链式调用
     */
    public IpResolver setSpare(String spare) {
        this.spare = spare;
        return this;
    }
    /**
     * 根据 IP 地址和数据源获取完整的地理位置信息。
     *
     * @return IP 地址对应的完整地理位置信息,如果解析失败返回 null
     */
    public String getComplete() {
        Ip2regionDTO parse = parse();
        if (parse == null) {
            throw new ToolboxException("解析失败,IP:" + this.ip);
        }
        if (DEFAULT_NULL_STR.equals(parse.getProvince())) {
            if (DEFAULT_NULL_STR.equals(parse.getCity())) {
                return null;
            }
            return parse.getCity();
        }
        String spareStr = this.spare == null ? "" : this.spare;
        return parse.getProvince() + spareStr + parse.getCity();
    }

    /**
     * 根据 IP 地址和数据源获取简化的地理位置信息(仅包含城市信息)。
     *
     * @return IP 地址对应的城市信息,如果解析失败返回 null
     * @since 2.7.5
     */
    public String getSimple() {
        Ip2regionDTO parse = parse();
        if (parse == null) {
            throw new ToolboxException("解析失败,IP:" + ip);
        }
        if (DEFAULT_NULL_STR.equals(parse.getCity())) {
            return null;
        }
        return parse.getCity();
    }

    /**
     * 解析 IP 地址的地理位置信息。
     *
     * @return 包含 IP 地址对应地理位置信息的 Ip2regionDTO 对象,
     * 如果解析失败返回 null
     */
    public Ip2regionDTO parse() {
        // 调用 Ip2regionUtils 工具类的方法获取城市信息
        String str = Ip2regionUtils.getCityInfo(this.ip, this.ipData);
        // 如果城市信息为空,解析失败,返回 null
        if (str == null) {
            return null;
        }
        // 使用默认分隔符分割城市信息字符串
        String[] arr = str.split(DEFAULT_SPARE_CHAR);
        // 创建 Ip2regionDTO 对象并设置各个属性值
        Ip2regionDTO ip2regionDTO = new Ip2regionDTO();
        ip2regionDTO.setCountry(arr[0]); // 设置国家
        ip2regionDTO.setRegion(arr[1]); // 设置地区
        ip2regionDTO.setProvince(arr[2]); // 设置省份
        ip2regionDTO.setCity(arr[3]); // 设置城市
        ip2regionDTO.setIsp(arr[4]); // 设置运营商
        // 返回包含地理位置信息的 Ip2regionDTO 对象
        return ip2regionDTO;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy