通过ip2region.xdb获取IP属地

本文介绍了如何在Java应用中使用ip2region框架进行IP地址定位,包括从HttpServletRequest获取IP、在启动时加载数据库到内存、以及处理并发请求。着重强调了解决jar包部署后资源查找问题和优化IO操作以适应高并发场景。

实现前提:

1:下载ip2region.xdb文件
lionsoul2014/ip2region:Ip2region (2.0 - xdb) 是一个离线IP地址管理与定位框架,能够支持数十亿级别的数据段,并实现十微秒级的搜索性能。它为多种编程语言提供了xdb引擎实现。_Go - GitCode开源社区Ip2region (2.0 - xdb) 是一个离线IP地址管理与定位框架,能够支持数十亿级别的数据段,并实现十微秒级的搜索性能。它为多种编程语言提供了xdb引擎实现。icon-default.png?t=N7T8https://gitcode.com/lionsoul2014/ip2region/overview2:安装依赖(注意这里的版本号,1开头的版本号和我这个版本号有区别,实现代码也是不同的)
<!--ip2region IP地址定位库-->
<dependency>
        <groupId>org.lionsoul</groupId>
        <artifactId>ip2region</artifactId>
        <version>2.6.5</version>
</dependency>

实现步骤:

1:通过HttpServletRequest获取IP地址

/**
 * 在 Nginx 等代理之后获取用户真实 IP 地址
 * @return 用户的真实 IP 地址
 */
public static String getIpAddress(HttpServletRequest request) {
    if (request == null) {
        return null;
    }
    String ip = request.getHeader("x-forwarded-for");
    if (isIpaddress(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
    }
    if (isIpaddress(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (isIpaddress(ip)) {
        ip = request.getHeader("HTTP_CLIENT_IP");
    }
    if (isIpaddress(ip)) {
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    }
    if (isIpaddress(ip)) {
        ip = request.getRemoteAddr();
        if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
            //根据网卡取本机配置的IP
            try {
                InetAddress inet = InetAddress.getLocalHost();
                ip = inet.getHostAddress();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
    }
    return ip;
}

2:在服务启动时加载 ip2region.db 到内存中(解决打包 jar 后找不到 ip2region.db 的问题)

@PostConstruct
private static void initIp2regionResource() {
        try {
                InputStream inputStream = new                 ClassPathResource("/ip/ip2region.xdb").getInputStream();
                byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream);
                // 创建一个完全基于内存的查询对象(请自行创建静态变量:Searcher searcher )
                searcher = Searcher.newWithBuffer(dbBinStr);
        } catch (Exception e) {
                e.printStackTrace();
        }
}

3:根据ip获取属地

public static String getIpPossessionByFile(String ip,Integer type) {
        if (StringUtils.isNotEmpty(ip)) {
                try {            
                        long sTime = System.nanoTime();
                        String region = searcher.search(ip);
                        long cost = TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - sTime);
                        region = region.replace("|0", "");//去掉特殊字符
                        log.info("{地区: {}, IO操作数: {}, 耗时: {} μs}", region, searcher.getIOCount(), cost);
                        return region;
                } catch (Exception e) {
                        log.error("获取IP地址异常:{} ", e.getMessage());
                        throw new RuntimeException("获取IP地址异常");
                }
        }
        return "未知";
}

注意考虑多并发的情况!!!

### 关于 `ip2region.xdb` 文件的下载 `ip2region.xdb` 是一个用于 IP 地址定位的数据库文件,可以通过官方项目仓库或其他可信渠道获取该文件。以下是关于如何下载此文件的相关说明: #### 官方 GitHub 仓库 `ip2region` 的开发者维护了一个公开的 GitHub 仓库,其中包含了最新版本的 `ip2region.xdb` 数据库文件以及相关工具和文档。可以访问以下链接找到并下载所需的 `.xdb` 文件[^1]。 - **GitHub 地址**: [https://github.com/lionsoul2014/ip2region](https://github.com/lionsoul2014/ip2region) 在该项目的 `data/` 目录下通常会提供预编译好的 `ip2region.xdb` 文件供用户直接下载使用。 #### 使用 Maven 构建时自动加载资源 如果计划通过 Spring Boot 或其他 Java 应用程序集成 `ip2region.xdb`,可以在项目的 `resources` 路径中手动放置该文件,或者利用 Maven 插件配置来确保 `.xdb` 文件不会被过滤掉[^2]。具体方法已在引用内容中提及。 ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.2.0</version> <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>xdb</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin> ``` 以上插件设置能够防止 `.xdb` 文件因扩展名原因而丢失其二进制数据完整性。 --- ### 注意事项 1. 确认所使用的 `ip2region.xdb` 版本与对应的 SDK 工具兼容。 2. 如果需要更新到最新的 `.xdb` 文件,请定期检查官方发布页面是否有新版本可用。 3. 对于生产环境部署,建议将 `.xdb` 文件存储至安全路径,并合理管理权限以保护敏感数据。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值