手把手教你实现显示IP归属地

简介: 近年来,根据《国家互联网用户账号名称信息管理规定》要求互联网用户账号服务平台标注IP地址属地信息,微信公众号、【昂焱数据】抖音、知乎各大平台纷纷都上线了IP归属地的功能。本文就带大家实现该功能,国内的用户精确到省份,国外用户精确到国家。

近年来,根据《国家互联网用户账号名称信息管理规定》要求互联网用户账号服务平台标注IP地址属地信息,微信公众号、抖音、知乎各大平台纷纷都上线了IP归属地的功能。本文就带大家实现该功能,国内的用户精确到省份,国外用户精确到国家。

实现原理

那么如何根据IP地址查找到详细的归属地信息呢?
答案是:通过 自治系统(Autonomous System)。

互联网是由不同网络组成的网络,自治系统是组成 Internet 的大型网络,连接到 Internet 的每台计算机或设备都连接到一个 AS。而每一个自治系统都会有一个编码,我们称之为 ASN。
可以认为 AS 类似于一个城镇的邮局。

邮件从一个邮局到另一个邮局,直到到达正确的城镇为止,然后该城镇的邮局将在该城镇内传递邮件。每个 AS 都控制一组特定的 IP 地址,就像每个镇的邮局负责将邮件传递到该镇内的所有地址一样。

通常,每个 AS 由单个大型组织(例如 Internet 服务提供商(ISP)、大型企业技术公司、大学或政府机构)运营。

到这里,我们可以捋清楚这样一个逻辑关系:IP地址 -> 地址块 -> 自治网络编码(ASN) -> 组织 -> 国家。

通过 IP 地址,我们就可以定位到一个大致的地理位置,例如:北京朝阳区、深圳南山区等。例如我现在的 IP 地址就归属于编码为 AS4xxx 这个自治网络,通过这个 ASN 可以知道位置在中国深圳,这个 ASN 编码所属的组织为 中国电信。

但是,要实现这样一个查找功能,首先得要有一个IP地址归属地数据库。网上找了下,以前淘宝网有一个开源的接口API开源调用,但不知道为何,近一两年,该接口地址已经下线不能使用了。我们可以通过调用昂焱数据平台提供的IP地址归属地接口来实现此功能。
IP地址归属地查询主要针对当前实际运用最多的IPv4地址,根据IP地址查询其归属地。IP地址归属地查询适用于网络定位、网络跟踪、网络排查等相关场景。

获取IP地址

首先,需要获取客户端IP地址

获取IP地址方法:

/**
     * 获取IP地址
     *
     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
     */
    public static String getIpAddr(HttpServletRequest request) {
        String ip = null;
        try {
            ip = request.getHeader("x-forwarded-for");
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP"); 
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
        } catch (Exception e) {
            logger.error("IPUtils ERROR ", e);
        }
        
        return ip; 
    }

调用IP归属地接口:

public class Test{

    // 请求的昂焱数据IP归属地接口地址
    public static final String URL = "https://www.ayshuju.com/data/ip/address";
    // 请求的密钥
    public static final String APPKEY = "请求的密钥";
    // 请求客户端
    public static OkHttpClient client = new OkHttpClient();

    public static void main(String[] args) throws IOException {

        RequestBody formBody = new FormBody.Builder()
                .add("appKey", APPKEY)
                .add("ip", "117.186.0.233")
                .build();

        // 执行post请求
        String result = doPostByFormData(URL, formBody);
        System.out.println(result);
    }

    /**
     * @param url url
     * @throws IOException
     */
    public static String doPostByFormData(String url, RequestBody body) throws IOException {

        Request request = new Request.Builder().url(url).post(body).build();

        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }

    }
}
更多技术资源、软件开发工具,欢迎访问【[昂焱数据]】,这里一定有惊喜等着你!
目录
相关文章
|
资源调度 JavaScript Windows
yarn install命令报错解决办法-warning package-lock.json found.
yarn install命令报错解决办法-warning package-lock.json found.
905 0
|
机器学习/深度学习 数据采集 数据可视化
【数据分析与可视化】SKlearn主要功能和模块概述(图文解释 简单易懂)
【数据分析与可视化】SKlearn主要功能和模块概述(图文解释 简单易懂)
787 0
|
3月前
|
安全 定位技术 API
个人用户必看!3 种准确查 IP 地址地理位置与运营商的实用方法
本文详解IP地理查询的原理与实操:解析IP“漂移”原因(动态分配、NAT、数据库滞后),对比在线网页、免费API、系统命令三种查询方式,并提供准确率提示与实用小贴士,助力用户快速定位IP归属地与运营商。
3545 1
|
存储 JSON 缓存
flutter 推荐插件:path_provider
flutter 推荐插件:path_provider
592 0
|
9月前
|
供应链 JavaScript Java
基于springboot的半成品配菜管理系统
本研究基于SpringBoot框架构建半成品配菜管理系统,旨在解决行业库存、订单与供应链管理难题。系统实现库存预警、订单自动化与供应链协同,提升企业效率与客户满意度,推动行业信息化、智能化发展,具有重要现实意义与应用价值。(238字)
|
12月前
|
人工智能 5G 定位技术
如何使用基站查询API帮你解析地理位置?
随着“新基建”战略推进,我国已建成全球领先的移动通信网络。基于基站数据的LBS定位服务成为各行业数字化转型的重要工具。探数平台基站查询API整合三大运营商数据,提供高精度、低延迟的地理位置查询服务,广泛应用于位置推荐、物流追踪等领域。本文详细介绍该API的核心功能、返回字段及调用流程,并通过Python示例展示使用方法。未来,随着5G和AI技术发展,基站定位将迈向厘米级精度,赋能自动驾驶、工业物联网等前沿领域,助力开发者抢占位置经济的战略高地。
3595 1
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
2103 0
|
小程序 测试技术 API
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
本文详细介绍元服务的开发及上架全流程,涵盖元服务的特点、创建项目、服务卡片、签名打包、开发测试及上架审核等环节,帮助开发者轻松掌握从零开始开发并发布元服务的全过程。元服务以其轻量、免安装、易于使用等特点,成为未来服务提供的重要形式。
2590 13
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
|
机器学习/深度学习 编解码 物联网
极致的显存管理!6G显存运行混元Video模型
混元 Video 模型自发布以来,已成为目前效果最好的开源文生视频模型,然而,这个模型极为高昂的硬件需求让大多数玩家望而却步。魔搭社区的开源项目 DiffSynth-Studio 近期为混元 Video 模型提供了更高效的显存管理的支持,目前已支持使用24G显存进行无任何质量损失的视频生成,并在极致情况下,用低至 6G 的显存运行混元 Video 模型!
1748 14
|
索引 Python
XPath解析之获取属性
XPath解析(三)
480 10