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地址获取归属地内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Cloud 的 Hystrix.功能及实践详解

    Spring Cloud 的 Hystrix.功能及实践详解

    这篇文章主要介绍了Spring Cloud 的 Hystrix.功能及实践详解,Hystrix 具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能,需要的朋友可以参考下
    2019-07-07
  • java中stack(栈)的使用代码实例

    java中stack(栈)的使用代码实例

    这篇文章主要介绍了java中stack(栈)的使用代码实例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java中的逻辑控制语句详解

    Java中的逻辑控制语句详解

    下面小编就为大家带来一篇Java逻辑控制的基础文章。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-08-08
  • java实现归并排序算法

    java实现归并排序算法

    归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 本文我们就来详细的探讨下。
    2015-04-04
  • 深入理解LinkedHashSet集合的底层机制

    深入理解LinkedHashSet集合的底层机制

    这篇文章主要介绍了LinkedHashSet的底层机制详解,LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序, 这使得元素看起来是以插入顺序保存的,需要的朋友可以参考下
    2023-10-10
  • Java类之间的关系图_动力节点Java学院整理

    Java类之间的关系图_动力节点Java学院整理

    在Java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强,有兴趣的可以了解一下
    2017-08-08
  • Apache Commons BeanUtils: JavaBean操作方法

    Apache Commons BeanUtils: JavaBean操作方法

    这篇文章主要介绍了Apache Commons BeanUtils: JavaBean操作的艺术,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • springboot中使用ConstraintValidatorContext验证两个字段内容相同

    springboot中使用ConstraintValidatorContext验证两个字段内容相同

    开发修改密码功能时,通过ConstraintValidator校验新密码和确认新密码的一致性,首先定义Matches注解和DTO对象,然后创建MatchesValidator类实现验证逻辑,对springboot验证字段内容相同问题感兴趣的朋友一起看看吧
    2024-10-10
  • Java Spring-Cache key配置注意事项介绍

    Java Spring-Cache key配置注意事项介绍

    本文主要对java spring-cache key配置注意事项进行了介绍,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • IDEA运行SpringBoot项目的超详细步骤截图

    IDEA运行SpringBoot项目的超详细步骤截图

    在当前的开发中Spring Boot开发框架已经成为主流,下面这篇文章主要给大家介绍了关于IDEA运行SpringBoot项目的超详细步骤截图,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论