手把手教你实现显示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();
        }

    }
}
更多技术资源、软件开发工具,欢迎访问【[昂焱数据]】,这里一定有惊喜等着你!
目录
相关文章
|
13天前
|
API 定位技术
查IP[查指定IP归属地]免费API接口教程
该API用于查询指定IPv4地址的归属地信息,支持POST和GET请求。需提供用户ID和KEY,可选填查询IP,默认为请求接口IP。返回信息包括状态码、地理位置及运营商等。示例请求和响应详见文档。
|
2月前
|
弹性计算 负载均衡 网络协议
内部名称解析设置阿里云私有 DNS 区域,针对于阿里云国际版经验教程
内部名称解析设置阿里云私有 DNS 区域,针对于阿里云国际版经验教程
|
2月前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
4月前
|
前端开发 API
Typecho——为评论增加地址信息展示
Typecho——为评论增加地址信息展示
40 0
|
前端开发
前端学习笔记202305学习笔记第二十二天-信息列表页实现2
前端学习笔记202305学习笔记第二十二天-信息列表页实现2
63 1
|
算法 JavaScript Apache
全网显示 IP 归属地,用上这个开源库,实现也太简单了
细心的小伙伴可能会发现,最近蘑菇新上线了 IP 属地的功能,小伙伴在发表动态、发表评论以及聊天的时候,都会显示自己的 IP 属地信息
436 0
|
前端开发
前端学习笔记202305学习笔记第二十二天-信息列表页实现1
前端学习笔记202305学习笔记第二十二天-信息列表页实现1
65 0
|
数据库
zblog实现评论显示IP归属地方法
随着各大网络平台开放显示归属地,近期想弄一个zblog评论归属地的显示,更精准的是弄一个接口调用,然后存到数据库,但从稳定和加载方面出发,使用到了离线库查询IP的归属地,这里就使用到了李洋开发的IP归属地查询插件。离线IP库是纯真IP免费公开版,目前还算可以吧。
187 0
zblog实现评论显示IP归属地方法
|
PHP
WordPress实现评论显示IP归属地方法
想给WordPress博客留言加个评论IP属地功能,本教程之前也介绍过zblog评论IP归属地显示方法,本期教程教大家如何给添加WordPress评论IP归属地。
621 0
WordPress实现评论显示IP归属地方法