Java通过Ip2region实现IP定位

这篇具有很好参考价值的文章主要介绍了Java通过Ip2region实现IP定位。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们在一些短视频平台上可以看到,视频作者或评论区可以显示IP地址,这其实就是根据IP获取到的我们可以通过一些在线网站就可以看到我们当前的公网IP和IP定位,最近有个需求也需要通过请求获取客户端的IP和IP的定位,于是通过一系列的百度,最终选择使用Ip2region这个工具库来进行定位

ip2region java,java,spring boot,ip

 Ip2region简介

Ip2region是一个开源工具库,是一种用于IP地址定位的工具。 它是基于B树数据结构的数据库,可用于将IP地址转换为国家、省、市、区县等信息。 使用Ip2region工具,您可以轻松地查找某个IP地址所在的区域信息,从而帮助您进行定位和分析。

目前Ip2region有1.0和2.0两个版本,p2region 1.0和Ip2region 2.0之间的主要区别在于数据的更新频率和精度。 Ip2region 2.0在原有版本的基础上增加了更多的数据,例如更详细的地图信息和更准确的IP地址定位。 Ip2region 2.0的数据更新频率也更高,这意味着它将提供更精确的信息。此外, Ip2region 2.0还提供了Java、Python和PHP等语言的版本,这使得它更加适用于不同类型的应用程序。

GitHub地址(CSDN镜像地址,非原地址):https://gitcode.net/mirrors/lionsoul2014/ip2region

 Ip2region使用

前面提到Ip2region分为1.0和2.0两个版本,此处我是用的是2.0版本,如需1.0版本此文章并不适用,可以参考如下文章

(153条消息) Java根据ip地址获取归属地_java通过ip地址获取地区_java技术媛的博客-CSDN博客

 Ip2region2.0版本引入依赖

2.7.0是当前最新版本,使用Ip2region2.0引入2.6.0版本及以上应该是都可以的

ip2region java,java,spring boot,ip

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

下载ip2region.xdb文件

下载链接;https://gitcode.net/mirrors/lionsoul2014/ip2region/-/blob/master/data/ip2region.xdb

 如果链接失效:进入上文github地址然后选在data文件夹,里面就有ip2region.xdb文件

ip2region java,java,spring boot,ip

 下载后将其放在resources文件夹下,注意在pom文件里添加排除配置,防止maven将文件编译

<plugin>
    <configuration>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>xdb</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
</plugin>

Searcher介绍

ip2region核心类就是Searcher,在2.0的版本中它有三种创建方式,三种方式使用方式不太一样,接下来逐一介绍

ip2region java,java,spring boot,ip

newWithFileOnly(String dbPath)

此种创建方式,只有一个参数,顾名思义,我们可以知道入参其实就是ip2region.xdb文件的路径,此种创建方式是最基础的创建方式,不支持并发,每次创建都需要进行一次IO,读取本地ip2region.xdb文件

newWithVectorIndex(String dbPath, byte[] vectorIndex)

此种创建方式多出来一个vectorIndex参数,它是一个字节数组我们可以提前从 xdb 文件中加载出来 VectorIndex 数据,然后全局缓存,每次创建 Searcher 对象的时候使用全局的 VectorIndex 缓存可以减少一次固定的 IO 操作,从而加速查询,减少 IO 压力。此种方式也不支持并发,每个线程需要重新new一个Searcher对象

newWithBuffer(byte[] cBuff)

此种创建方式只有一个cBuff参数,它可以预先加载整个 ip2region.xdb 的数据到内存,然后基于这个数据创建查询对象来实现完全基于文件的查询无IO压力,而且仅占用11M内存,最重要的是它支持并发,全局只需要创建一次即可,也是查询效率最高的一种方法,下面我自己封装了一个工具类,就是采用的这种方式

工具类代码

/**
 * ip解析工具
 *
 * @author zzt
 * @version v1.0.0
 * @date 2023/6/9 9:26
 */
@Slf4j
public class IpParseUtil {

    /**
     * 将整个xdb文件加载到内存中(11M左右),此种创建方式支持多线程,因此只需要加载一次
     */
    private final static Searcher SEARCHER;

    static {
        try {
            ClassPathResource resource = new ClassPathResource("ip2region.xdb");
            //获取真实文件路径
            String path = resource.getURL().getPath();
            byte[] cBuff = Searcher.loadContentFromFile(path);
            SEARCHER = Searcher.newWithBuffer(cBuff);
            log.info("加载了ip2region.xdb文件,Searcher初始化完成!");
        } catch (Exception e) {
            log.error("初始化ip2region.xdb文件失败,报错信息:[{}]", e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
    }


    /**
     * 解析ip地址
     *
     * @param ipStr 字符串类型ip 例:192.168.0.1
     * @return 返回结果形式(国家|区域|省份|城市|ISP) 例 [中国, 0, 河北省, 衡水市, 电信]
     */
    public static List<String> parse(@NotBlank String ipStr) {
        return parse(ipStr, null);
    }

    /**
     * 自定义解析ip地址
     *
     * @param ipStr ip 字符串类型ip 例:1970753539(经过转换后的)
     * @param index 想要获取的区间 例如:只想获取 省,市 index = [2,3]
     * @return 返回结果例 [北京,北京市]
     */
    public static List<String> parse(@NotBlank String ipStr, int[] index) {
        try {
            long ip = Searcher.checkIP(ipStr);
            return parse(ip, index);
        } catch (Exception e) {
            log.error("ip解析为long错误,ipStr:[{}],错误信息:[{}]", ipStr, e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
    }

    /**
     * 自定义解析ip地址
     *
     * @param ip    ip Long类型ip
     * @param index 想要获取的区间 例如:只想获取 省,市 index = [2,3]
     * @return 返回结果例 [河北省, 衡水市]
     */
    public static List<String> parse(@NotNull Long ip, int[] index) {
        //获取xdb文件资源
        List<String> regionList = new ArrayList<>();
        try {
            String region = SEARCHER.search(ip);
            String[] split = region.split("\\|");
            if (index == null) {
                regionList = Arrays.asList(split);
            } else {
                for (int i : index) {
                    regionList.add(split[i]);
                }
            }
            //关闭资源
            SEARCHER.close();
        } catch (Exception e) {
            log.error("根据ip解析地址失败,ip:[{}],index[{}],报错信息:[{}]", ip, index, e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
        return regionList;
    }
}

简单测试 

public class IPTest {
    public static void main(String[] args) {
        //只获取省,市
        int[] index = {2, 3};
        List<String> parse = IpParseUtil.parse("222.223.145.133", index);
        System.out.println(parse);
    }
}

ip2region java,java,spring boot,ip文章来源地址https://www.toymoban.com/news/detail-561386.html

到了这里,关于Java通过Ip2region实现IP定位的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【GitHub精选项目】IP 地址转地理位置:ip2region 完全指南

    本文为大家带来的是 lionsoul2014 开发的 ip2region 项目,一种高效的离线 IP 地址定位库。ip2region 提供了10微秒级别的查询效率,支持多种主流编程语言,是一种理想的 IP 定位解决方案。 这个开源项目可以实现 IP 地址到地理位置的精确映射,包括国家、省份、城市、运营商等信

    2024年02月04日
    浏览(23)
  • java实现通过IP地址获取mac(物理地址)

    java实现通过IP地址获取mac(物理地址),只能获取到局域网的mac地址,具体代码如下:

    2024年02月16日
    浏览(39)
  • 【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)

    【写在前面】 编撰这篇文章还得从之前做安全业务需求说起,我们都知道安全攻击都是在某台客户机上执行某些恶意操作(sql注入,DoS/DDoS攻击),致使服务端响应异常崩溃亦或响应数据被篡改,那么怎么去阻止这些东西呢? 首先我想到的是对访问的web端做一个IP的校验(好

    2023年04月24日
    浏览(38)
  • Stable Diffusion 绘画入门教程(webui)-ControlNet(IP2P)

    上篇文章介绍了深度Depth,这篇文章介绍下IP2P(InstructP2P), 通俗理解就是图生图,给原有图加一些效果,比如下图,左边为原图,右边为增加了效果的图: 玩法流程和之前一样哦 我这里用的大模型是\\\"anything-v5-PrtRE.safetensors\\\",选用不同模型生成效果会有区别,可以自己找喜欢的

    2024年04月25日
    浏览(45)
  • 使用java代码实现BacNet协议通过设备IP与设备ID同网段获取到对方设备数据

    本文章参考了很多博主的案列 收获很多很感谢他们 我把他们的文章标注出来 可能我的方法并不适合你 使用感兴趣伙伴们可以的效仿他们的一下 (13条消息) BacNet4j-跨网段-项目运用_森林猿的博客-CSDN博客 (13条消息) BACnet/IP之BACnet4j学习java代码例子属性读写01_夢_殤的博客-CSDN博

    2024年02月05日
    浏览(34)
  • Java-通过IP获取真实地址

    最近写了一个日志系统,需要通过访问的 IP 地址来获取真实的地址,并且存到数据库中,我也是在网上看了一些文章,遂即整理了一下供大家参考。 这个是获取正确 IP 地址的方法,可以直接使用的。 通过以上方法你可以获取到访问者的 IP 地址,只有获取到了 IP 地址,才能

    2024年02月15日
    浏览(34)
  • docker:Java通过nginx获取客户端的真实ip地址

    我们的平台使用Spring Cloud微服务架构,使用Spring Boot构建Java服务,使用google的jib插件打成docker镜像包 我们使用docker虚拟化部署,使用docker-compose统一管理所有服务,包括Java服务和nginx等组件 我们前后端分离,前端通过nginx访问我们的网关(Spring Cloud Gateway),再转发到对应的

    2024年01月18日
    浏览(41)
  • MySQL系列:限制IP访问,通过授权的方式实现

    一、允许用户所有IP访问 更改  mysql  数据库里的  user  表里的  host  项,从 localhost\\\" 改成 % 即可。有两种方式可以实现。 第一种:直接修改 user  表 第二种:授权的方式 二、限制某个IP或者IP段访问 建议通过授权的方式实现。 注意: 1、注意授权后必须FLUSH PRIVILEGES;否则无

    2024年02月12日
    浏览(29)
  • IP归属地与IP定位

    IP归属地查询是指根据给定的IP地址,确定该IP地址所属的地理位置或网络服务提供商。这种查询可以帮助用户了解到访者的地理位置,有助于网络安全、反垃圾邮件等应用。  在实际应用中,IP归属地查询常用于以下几个方面: 网络安全:通过IP归属地查询,可以确定访问者

    2024年02月12日
    浏览(23)
  • Internet通过TCP/IP协议可以实现多个网络的无缝连接

    Internet通过TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网协议)协议实现多个网络的无缝连接 。 TCP/IP是Internet的基础通信协议套件,它定义了数据如何在不同网络之间传输和路由,使得全球范围内的不同计算机和网络可以互相通信。TCP/IP协议套件包括多个

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包