其他分享
首页 > 其他分享> > 2020-11-25

2020-11-25

作者:互联网

一、 什么是ip2region

ip2region:可以根据他获取一个具体ip的信息,国家、具体地址、网络服务商

二、添加依赖

<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>1.7</version>
</dependency>

三、工具类

public class AddressUtils {

    /**
     * 根据IP地址获取地理位置
     */
    public static String getAddressByIP(String ip) {
        if (StringUtils.isBlank(ip)) {
            return "";
        }
        if ("127.0.0.1".equals(ip)||"0:0:0:0:0:0:0:1".equals(ip)) {
            return "局域网,无法获取位置";
        }

//        //开发时使用的代码
//        String dbPath = AddressUtils.class.getResource("/ip2region.db").getPath();
//        File file = new File(dbPath);
//        if ( file.exists() == false ) {
//            System.out.println("Error: Invalid ip2region.db file");
//        }
//        //查询算法
        int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree
//        //DbSearcher.BINARY_ALGORITHM //Binary
//         int algorithm =DbSearcher.MEMORY_ALGORITYM; //Memory
//        try {
//            DbConfig config = new DbConfig();
//            DbSearcher searcher = new DbSearcher(config, dbPath);
//            //define the method
//            Method method = null;
//            switch ( algorithm )
//            {
//                case DbSearcher.BTREE_ALGORITHM:
//                    method = searcher.getClass().getMethod("btreeSearch", String.class);
//                    break;
//                case DbSearcher.BINARY_ALGORITHM:
//                    method = searcher.getClass().getMethod("binarySearch", String.class);
//                    break;
//                case DbSearcher.MEMORY_ALGORITYM:
//                    method = searcher.getClass().getMethod("memorySearch", String.class);
//                    break;
//            }
//            DataBlock dataBlock = null;
//            if (Util.isIpAddress(ip) == false ) {
//                System.out.println("Error: Invalid ip address");
//            }
//            dataBlock  = (DataBlock) method.invoke(searcher, ip);
//            return dataBlock.getRegion();
        //部署时使用的代码
        try{
            //        读取jar包内的配置文件信息
            ClassPathResource resource = new ClassPathResource("/ip2region.db");
            InputStream inputStream = resource.getInputStream();
            byte[] dbBinStr = IoUtil.readBytes(inputStream);
            DbConfig config = new DbConfig();
            DbSearcher searcher = new DbSearcher(config, dbBinStr);
            // 查询算法memory,采用二进制方式初始化DBSearcher需要使用MEMORY_ALGORITYM,
            //否则会抛出null。
            Method method = searcher.getClass().getMethod("memorySearch", String.class);
            return ((DataBlock) method.invoke(searcher, ip)).getRegion();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

三、遇到的错误

如我上面工具类所写的,开发时的代码和部署时的代码是不一样的,这是因为,ip2region所依赖的ip2region文件(如下:)在打包成jar时,使用开发时所写的代码是读取不到的,必须以部署时的代码,才能读取到。
在这里插入图片描述
这个问题的参考文章

标签:11,25,ip2region,String,searcher,ip,DbSearcher,2020,method
来源: https://blog.csdn.net/cristianoxm/article/details/110110167