使用 ip2region 或 geoip2 根据用户ip获取用户省市

news/2024/12/23 15:37:36/

使用 ip2region 或 geoip2 根据用户ip获取用户省市

这两种方式都不能获取到区县级别
简单的测试 中感觉 geoip 不如 ip2region 精确,而且 ip2region 的数据库文件也要小一些

ip2region

官方地址: https://github.com/lionsoul2014/ip2region/tree/master

在pom中引入内容

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

代码示例

import org.lionsoul.ip2region.xdb.Searcher;
public String testIp2Region() {  // 测试的ip地址  String ip = "112.13.53.138";  // 获取resource下的xdb文件  String dbPath = Object.class.getResource("/ip2region.xdb").getPath();  // 1、从 dbPath 加载整个 xdb 到内存。  byte[] cBuff;  try {  cBuff = Searcher.loadContentFromFile(dbPath);  } catch (Exception e) {  System.out.printf("failed to load content from `%s`: %s\n", dbPath, e);  return null;    }  // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。  Searcher searcher;  try {  searcher = Searcher.newWithBuffer(cBuff);  } catch (Exception e) {  System.out.printf("failed to create content cached searcher: %s\n", e);  return null;    } // 3、查询  try {// 结果的固定格式 国家|区域|省份|城市|ISP 缺省补0// 这里区域没有获取到 补了0String region = searcher.search(ip);System.out.printf(region); // 中国|0|浙江省|温州市|移动  return region;  } catch (Exception e) {  System.out.printf("failed to search(%s): %s\n", ip, e);  }  return null;  
}

geoip2

官方下载地址需要注册: https://www.maxmind.com/en/accounts/current/geoip/downloads

我是在这里下载的: https://github.com/P3TERX/GeoLite.mmdb?tab=readme-ov-file

在pom中引入内容

<dependency>  <groupId>com.maxmind.geoip2</groupId>  <artifactId>geoip2</artifactId>  <version>2.12.0</version>  
</dependency>

代码示例

import com.maxmind.geoip2.DatabaseReader;  
import com.maxmind.geoip2.model.CityResponse;  
import com.maxmind.geoip2.record.*;
public void testGeoip() {  // 测试ip  String ip = "112.13.53.138";  // GeoIP2-City 数据库文件  String dbPath = Object.class.getResource("/GeoLite2-City.mmdb").getPath();  File database = new File(dbPath);  // 创建 DatabaseReader对象  try {  DatabaseReader reader = new DatabaseReader.Builder(database).build();  InetAddress ipAddress = InetAddress.getByName(ip);  CityResponse response = reader.city(ipAddress);  Country country = response.getCountry();  System.out.println(country.getIsoCode());  System.out.println(country.getName()); // 国家  System.out.println(country.getNames().get("zh-CN")); // 国家中文  Subdivision subdivision = response.getMostSpecificSubdivision();  System.out.println(subdivision.getIsoCode());  System.out.println(subdivision.getName()); // 省市  System.out.println(subdivision.getNames().get("zh-CN"));// 省市中文  City city = response.getCity();  System.out.println(city.getName()); // 城市  System.out.println(city.getNames().get("zh-CN"));// 城市中文  Location location = response.getLocation();  System.out.println(location.getLatitude());  // 纬度  System.out.println(location.getLongitude()); // 经度  } catch (Exception e) {  e.printStackTrace();  }  
}

http://www.ppmy.cn/news/1338636.html

相关文章

7.NFS服务器

目录 1. 简介 1.1. NFS背景介绍 1.2. 生产应用场景 2. NFS工作原理 2.1. 示例图 2.2. 流程 3. NFS的使用 3.1. 安装 3.2. 配置文件 3.3. 主配置文件分析 3.4. 实验1 3.5. NFS账户映射 3.5.1. 实验2&#xff1a; 3.5.2. 实验3 4. autofs自动挂载服务 4.1. 产生原…

更改远程桌面网关端口和远程Web应用程序端口

很多玩Home-Lab的小伙伴会使用远程桌面网关&#xff08;Remote Desktop Gateway&#xff09;来安全远程家庭内网的计算机&#xff0c;但由于国内电信法律法规的原因&#xff0c;普通家庭宽带并不能使用默认的443端口&#xff08;TCP&#xff09;和3391端口&#xff08;UDP&…

关键词搜索商品api京东接口关键词搜索商品查询宝贝信息数据、价格、销量调用示例

接入关键词搜索商品API接口的步骤如下&#xff1a; 获取API密钥&#xff1a;首先&#xff0c;你需要从API提供商那里获取一个API密钥。这个密钥将用于验证你的请求。 构造请求URL&#xff1a;根据你的需求&#xff0c;构造请求URL。通常&#xff0c;这包括基础URL、API密钥和任…

【MySQL】学习如何通过DML更新数据库的数据

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-QIqURn9fNFMjLD9l {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Node.js Express 框架 2024版 笔记

1.0 操作命令 Node.js express 框架 https://www.expressjs.com.cn/ npm install -g express-generator expressexpress --pug --git // --pug 添加对 pug 模板引擎的支持 // --git 添加 .gitignore 代码仓库排除 //无法直接安装新版pug模板 npm i npm …

11.Ubuntu

目录 1. 什么是Ubuntu 1.1. 概述 1.2. Ubuntu版本简介 1.2.1. 桌面版 1.2.2. 服务器版 2. 部署系统 2.1. 新建虚拟机 2.2. 安装系统 2.3. 部署后的设置 2.3.1. 设置root密码 2.3.2. 关闭防火墙 2.3.3. 启用允许root进行ssh 2.3.4. 安装所需软件 2.3.5. 制作快照 …

cx_oracle连接oracle的us7ascii数据集乱码问题

1.问题 oracle数据库使用到的字符集是us7ascii&#xff0c;总的来说就是ascii数据集&#xff0c;7位表示一个字符&#xff0c;对于英文还没有问题&#xff0c;但是遇到中文就G了。 查看自己数据库使用的字符集&#xff1a; SELECT value FROM nls_database_parameters WHERE …

React18-模拟列表数据实现基础表格功能

文章目录 分页功能分页组件有两种接口参数分页类型用户列表参数类型 模拟列表数据分页触发方式实现目录 分页功能 分页组件有两种 table组件自带分页 <TableborderedrowKey"userId"rowSelection{{ type: checkbox }}pagination{{position: [bottomRight],pageSi…