前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你实现显示IP归属地

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

原创
作者头像
用户8236825
发布2023-03-27 23:29:45
1K0
发布2023-03-27 23:29:45
举报
文章被收录于专栏:接口API

@TOC

近年来,根据《国家互联网用户账号名称信息管理规定》要求互联网用户账号服务平台标注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地址方法:

代码语言:java
复制
/**
	 * 获取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归属地接口:

代码语言:java
复制
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();
        }

    }
}

更多技术资源、软件开发工具,欢迎访问【昂焱数据】,这里一定有惊喜等着你!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现原理
  • 获取IP地址
  • 调用IP归属地接口:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档