IP 归属用 Ip2region 就够了

这篇具有很好参考价值的文章主要介绍了IP 归属用 Ip2region 就够了。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


抖音、微博、小红书等各平台相继上线" 网络用户IP地址显示功能", 境外显示 国家境内显示到 省市,且该功能无法关闭,IP地址为强制显示。无疑更加有效的约束键盘侠的言行举止,还原一个干净的网络环境!

作为技术人来说其实这个功能so easy,下面借助Ip2region来实现

Ip2region 简介

是什么

ip2region v2.0 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的xdb数据生成和查询客户端实现。

特性

  • 标准化的数据格式

每个ip数据段的region信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0。

  • 数据去重和压缩

xdb格式生成程序会自动去重和压缩部分数据,默认的全部IP数据,生成的 ip2region.xdb数据库是11MiB,随着数据的详细度增加数据库的大小也慢慢增大。

  • 极速查询响应

即使是完全基于xdb文件的查询,单次查询响应时间在十微秒级别,可通过如下两种方式开启内存加速查询:

  1. vIndex 索引缓存:使用固定的512KiB的内存空间缓存vector index 数据,减少一次IO磁盘操作,保持平均查询效率稳定在10-20微秒之间。
  2. xdb 整个文件缓存:将整个xdb文件全部加载到内存,内存占用等同于xdb 文件大小,无磁盘 IO 操作,保持微秒级别的查询效率。

注:下文实操以缓存 xdb 整个文件为例

支持的编程语言

binding 描述 开发状态 binary查询耗时 b-tree查询耗时 memory查询耗时
c ANSC c binding 已完成 0.0x毫秒 0.0x毫秒 0.00x毫秒
c# c# binding 已完成 0.x毫秒 0.x毫秒 0.1x毫秒
golang golang binding 已完成 0.x毫秒 0.x毫秒 0.1x毫秒
java java binding 已完成 0.x毫秒 0.x毫秒 0.1x毫秒
lua lua实现的binding 已完成 0.x毫秒 0.x毫秒 0.x毫秒
lua_c lua的c扩展 已完成 0.0x毫秒 0.0x毫秒 0.00x毫秒
nginx nginx的c扩展 已完成 0.0x毫秒 0.0x毫秒 0.00x毫秒
nodejs nodejs 已完成 0.x毫秒 0.x毫秒 0.1x毫秒
php php实现的binding 已完成 0.x毫秒 0.1x毫秒 0.1x毫秒
php5_ext php5的c扩展 已完成 0.0x毫秒 0.0x毫秒 0.00x毫秒
php7_ext php7的c扩展 已完成 0.0毫秒 0.0x毫秒 0.00x毫秒
python python bindng 已完成 0.x毫秒 0.x毫秒 0.x毫秒
rust rust binding 已完成 0.x毫秒 0.x毫秒 0.x毫秒

案例实操

依赖

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

获取IP

根据Request请求,从请求头中获取IP地址

package cn.goitman.utils;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @author Nicky
 * @version 1.0
 * @className IpUtil
 * @blog goitman.cn | blog.csdn.net/minkeyto
 * @description 解析IP地址工具
 * @date 2023/3/23 16:45
 */
public class IpUtil {

    private static Logger log = LoggerFactory.getLogger(IpUtil.class);

    private static final String UNKNOWN = "unknown";

    public static String getIpAddress(HttpServletRequest request) {
        String ip = null;
        try {
            // k8s将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。
            ip = request.getHeader("X-Original-Forwarded-For");
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("X-Forwarded-For");
            }
            // 通过nginx获取ip
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("x-forwarded-for");
            }
            // 通过Apache代理获取ip
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            // 通过WebLogic代理获取ip
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            // 通过负载均衡获取IP地址(HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR)
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            // 通过Nginx获取ip(Nginx中的另一个变量,内容就是请求中X-Forwarded-For的信息)
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            //兼容集群获取ip
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
                // 客户端和服务器为同一台机器时,获取的地址为IPV6格式:"0:0:0:0:0:0:0:1"
                if ("127.0.0.1".equalsIgnoreCase(ip) || "0:0:0:0:0:0:0:1".equalsIgnoreCase(ip)) {
                    //根据网卡取本机配置的IP
                    InetAddress iNet = null;
                    try {
                        iNet = InetAddress.getLocalHost();
                        ip = iNet.getHostAddress();
                    } catch (UnknownHostException e) {
                        log.error("根据网卡获取IP地址异常: ", e);
                    }
                }
            }
        } catch (Exception e) {
            log.error("获取IP地址异常 ", e);
        }
        //使用代理,则获取第一个IP地址
        if (!StringUtils.isEmpty(ip) && ip.indexOf(",") > 0) {
            ip = ip.substring(0, ip.indexOf(","));
        }
        return ip;
    }
}

输入流转化

package cn.goitman.utils;

import java.io.*;

/**
 * @author Nicky
 * @version 1.0
 * @className FileUtil
 * @blog goitman.cn | blog.csdn.net/minkeyto
 * @description 输入流工具
 * @date 2023/3/23 17:22
 */
public class InputStreamUtil {

    /**
    * 将输入流转化为字节数组
    */
    public static byte[] inputStreamToByteArray(InputStream inputStream) {
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[1024];
            int num;
            while ((num = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, num);
            }
            byteArrayOutputStream.flush();
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

解析IP

下载ip2region仓库中的ip2region.xdb文件,然后放到resource目录下

ip2region.xdb文件路径:https://github.com/lionsoul2014/ip2region/tree/master/data

package cn.goitman.service;

import cn.goitman.utils.InputStreamUtil;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.io.InputStream;
import java.util.concurrent.TimeUnit;

/**
 * @author Nicky
 * @version 1.0
 * @className SearcherFile
 * @blog goitman.cn | blog.csdn.net/minkeyto
 * @description 解析ip地址属性
 * @date 2023/3/23 17:21
 */
@Service
public class SearcherService {
    public String getRegion(String ip) {
        // jar包也能获取ip2region.xdb文件
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("ip2region.xdb");
        byte[] bytes = InputStreamUtil.inputStreamToByteArray(in);

        try {
            Searcher searcher = Searcher.newWithBuffer(bytes);

            long sTime = System.nanoTime();
            // 中国|0|上海|上海市|联通;美国|0|犹他|盐湖城|0
            String regionInfo = searcher.search(ip);
            String region = getCityInfo(regionInfo);
            long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
            System.out.printf("{IP属地 : %s, ip: %s, 耗时: %d 纳秒}\n", region, ip, cost);
            return region;
        } catch (Exception e) {
            System.out.printf("IP地址异常 (%s) : %s\n", ip, e);
            return null;
        }
    }

    /**
     * 解析城市信息,国内显示城市名,国外显示国家名
     */
    private String getCityInfo(String regionInfo) {
        if (!StringUtils.isEmpty(regionInfo)) {
            String[] cityArr = regionInfo.replace("|0", "").replace("0|", "").split("\\|");
            if (cityArr.length > 0) {
                if ("内网ip".equalsIgnoreCase(cityArr[0])) {
                    return "内网IP";
                }
                if ("中国".equals(cityArr[0])) {
                    return cityArr[1];
                }
                return cityArr[0];
            }
        }
        return "未知IP";
    }
}

测试

ip2region,技术专题,Ip2region,负载均衡,Request,WebLogic,nginx

没什么蹊跷,就是这么简单,下班…

源码:https://github.com/wangdaicong/spring-boot-project/tree/master/ip2region-demo文章来源地址https://www.toymoban.com/news/detail-793417.html

到了这里,关于IP 归属用 Ip2region 就够了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【GitHub精选项目】IP 地址转地理位置:ip2region 完全指南

    本文为大家带来的是 lionsoul2014 开发的 ip2region 项目,一种高效的离线 IP 地址定位库。ip2region 提供了10微秒级别的查询效率,支持多种主流编程语言,是一种理想的 IP 定位解决方案。 这个开源项目可以实现 IP 地址到地理位置的精确映射,包括国家、省份、城市、运营商等信

    2024年02月04日
    浏览(34)
  • IP归属地与IP定位

    IP归属地查询是指根据给定的IP地址,确定该IP地址所属的地理位置或网络服务提供商。这种查询可以帮助用户了解到访者的地理位置,有助于网络安全、反垃圾邮件等应用。  在实际应用中,IP归属地查询常用于以下几个方面: 网络安全:通过IP归属地查询,可以确定访问者

    2024年02月12日
    浏览(38)
  • 【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)

    【写在前面】 编撰这篇文章还得从之前做安全业务需求说起,我们都知道安全攻击都是在某台客户机上执行某些恶意操作(sql注入,DoS/DDoS攻击),致使服务端响应异常崩溃亦或响应数据被篡改,那么怎么去阻止这些东西呢? 首先我想到的是对访问的web端做一个IP的校验(好

    2023年04月24日
    浏览(45)
  • IP背后的信息,怎么查IP归属地?

    今天我就要给大家介绍IP背后隐藏的事儿。这节课的内容绝对不要错过,这是你以后搭建店铺网络环境必不可少的知识。 无论是手机号码,还是座机号码,都有一个归属地。一个陌生人给你打电话,或者你给陌生人打电话。你不知道他是谁,但是你至少知道这个电话号码是属

    2024年02月04日
    浏览(39)
  • IP获取归属地区(免费)

    使用 http://whois.pconline.com.cn/ipJson.jsp 这个 URL 来获取 IP 地址的归属城市信息

    2024年02月16日
    浏览(43)
  • java获取ip地址以及ip归属地工具类

    需要ip2region.db文件,可以前往github下载 欢迎访问我的博客网站: www.yqiu.top

    2024年02月22日
    浏览(47)
  • IP归属地API分享

    各大网站和app都更新了用户IP归属地功能,但是如何获取IP归属地信息科难为了一些技术人员了,下面给大家分享最好用的IP归属地API,能够大大的提升了效率。   IP归属地API( IP66_ip归属地在线查询_免费ip查询_ip精准定位平台 ),根据IP地址查询归属地信息,包含国家、省、

    2024年02月08日
    浏览(42)
  • Java获取IP及归属地

    最近我们发现各大社交平台都出现了一个新的功能:IP属地。 比如某乎: 这个IP属地是怎么做到的呢?今天我来教教你,保证你看完直呼Easy~ 1.Java网络编程 2.Servlet 通过运行这个方法,可以看到,控制台打印了IP和城市信息,也就是我们想要的 IP属地信息 啦! 在你的项目里,

    2024年02月11日
    浏览(65)
  • 如何高效地查询IP归属地

    高效识别IP归属地是网络安全领域中的一项重要工作。准确地识别IP的归属地不仅可以帮助网络管理员追踪和定位潜在的网络攻击者,还可以用于网络流量分析、地理定位服务等方面。  以下将介绍几种高效识别IP归属地的方法。 使用IP归属地数据库 IP归属地数据库是一种存储

    2024年02月15日
    浏览(47)
  • 教你如何实现IP归属地功能

           随着网络的发展先在抖音、知乎、快手、小红书等这些平台已经上线了“网络用户显示 IP 的功能”,境外用户显示的是国家,国内的用户显示的省份,而且此项显示无法关闭,归属地强制显示。今天这篇文章,就用几分钟的时间来讲述一下这个功能是怎么实现的。

    2024年01月20日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包