JAVA根据ip地址获取归属地的实现方法

 更新时间:2023年10月10日 14:21:02   作者:旺崽刘奶  
本文主要介绍了JAVA根据ip地址获取归属地的实现方法,要通过Java程序获取IP地址对应的城市,需要借助第三方的IP地址库,下面就来介绍一下,感兴趣的可以了解一下

IP获取归属地

1.通过地址库获取

如果使用API接口获取,可能会出现服务挂了,或者服务地址不提供服务了等问题。而采用本地地址库就没有这些问题。

本文采用离线IP地址定位库 Ip2regionIp2region是一个离线IP地址定位库,微秒的查询时间:

实现步骤:

访问官网github地址:https://github.com/lionsoul2014/ip2region

 找到data目录下的:ip2region.xdb文件下载下来

 把ip2region.xdb文件放在resources目录下

在模块中引入maven依赖

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

获取归属地:

private Searcher searcher;
@Override
    public String getIpAddress(String ip){
        if ("127.0.0.1".equals(ip) || ip.startsWith("192.168")) {
            return "|||局域网ip";
        }
        if (searcher == null) {
            try {
                File file = ResourceUtils.getFile("classpath:db/data_ip2region.xdb");
                String dbPath = file.getPath();
                searcher = Searcher.newWithFileOnly(dbPath);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String region = null;
        String errorMessage = null;
        try {
            region = searcher.search(ip);
        } catch (Exception e) {
            errorMessage = e.getMessage();
            if (errorMessage != null && errorMessage.length() > 256) {
                errorMessage = errorMessage.substring(0, 256);
            }
            e.printStackTrace();
        }
        // 输出 region
        System.out.println(region);
        return region;
    }
 

这里Searcher引用的是仓库里面的检索方法,到这里就完成了可以获取到ip对应的归属地。

调用方法后运行结果如下

注意!!!! 本地是没问题的 如果打成jar包放在linux服务器上会读取不到

解决办法:     

    public String getIpCity(String ip) {
        if ("127.0.0.1".equals(ip) || ip.startsWith("192.168")) {
            return "|||局域网ip";
        }
        if (searcher == null) {
            try {
                //本地环境需要加上 classpath:
//                File file = ResourceUtils.getFile("db/data_ip2region.xdb");
//                String dbPath = file.getPath();
//                searcher = Searcher.newWithFileOnly(dbPath);
                   //这里通过流获取 解决jar包无法读取文件问题
                ResponseEntity<byte[]> test = test("db/data_ip2region.xdb");
                searcher = Searcher.newWithBuffer(test.getBody());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String region = null;
        String errorMessage = null;
        try {
            region = searcher.search(ip);
        } catch (Exception e) {
            errorMessage = e.getMessage();
            if (errorMessage != null && errorMessage.length() > 256) {
                errorMessage = errorMessage.substring(0, 256);
            }
            e.printStackTrace();
        }
        // 输出 region
        return region;
    }
    public static ResponseEntity<byte[]> test(String templateName) throws IOException {
        ClassPathResource classPathResource = new ClassPathResource(templateName);
        String filename = classPathResource.getFilename();
        @Cleanup InputStream inputStream = classPathResource.getInputStream();
        byte[] bytes = FileCopyUtils.copyToByteArray(inputStream);
        String fileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");// 为了解决中文名称乱码问题
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", fileName);
        return new ResponseEntity<>(bytes, headers, HttpStatus.CREATED);
    }

至于什么是Ip2region 官网上面有介绍这里就不多介绍了

到此这篇关于JAVA根据ip地址获取归属地的实现方法的文章就介绍到这了,更多相关JAVA ip地址获取归属地内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成SAP的过程及本地IDEA启动和Windows服务器部署

    SpringBoot集成SAP的过程及本地IDEA启动和Windows服务器部署

    本文给大家介绍SpringBoot集成SAP的过程及本地IDEA启动和Windows服务器部署的相关知识,本文给大家介绍的详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-07-07
  • Java中的clone()和Cloneable接口实例

    Java中的clone()和Cloneable接口实例

    这篇文章主要介绍了Java中的clone()和Cloneable接口实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 详解Java8 StreamAPI中的map()方法

    详解Java8 StreamAPI中的map()方法

    Stream API 是Java8中新加入的功能,这篇文章主要带大家了解一下 Stream API 中的 map() 方法的使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • Java实现顺序表的操作

    Java实现顺序表的操作

    这篇文章主要为大家详细介绍了Java实现顺序表的基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java SpringBoot详解集成以及配置Swagger流程

    Java SpringBoot详解集成以及配置Swagger流程

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步
    2021-10-10
  • 关于SpringBoot接收json格式的Demo案例

    关于SpringBoot接收json格式的Demo案例

    这篇文章主要介绍了关于SpringBoot接收json格式的Demo案例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java中final变量使用总结

    Java中final变量使用总结

    这篇文章主要介绍了Java中final变量使用总结,final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值,通常final定义的变量为常量,需要的朋友可以参考下
    2015-06-06
  • Java实战项目之校园跑腿管理系统的实现

    Java实战项目之校园跑腿管理系统的实现

    只有理论是不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+Springboot+vue+maven+elementui+mysql实现一个校园跑腿管理系统,大家可以在过程中查缺补漏,提升水平
    2022-01-01
  • java进阶之了解SpringBoot的配置原理

    java进阶之了解SpringBoot的配置原理

    今天带大家了解SpringBoot的相关知识,文中对SpringBoot的配置原理作了非常详细的图文示例及介绍,需要的朋友可以参考下
    2021-06-06
  • java操作时间方式基础教程demo

    java操作时间方式基础教程demo

    这篇文章主要为大家介绍了java操作时间方式demo基础教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论