Java 根据IP地址获取城市(ip2region)
根据IP地址获取城市(ip2region)
- Ip2region是什么?
- Ip2region特性
- 99.9%准确率
- 标准化的数据格式
- 体积小
- 查询速度快
- 多查询客户端的支持
- maven集成
- 小坑
Ip2region是什么?
ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。
Ip2region特性
99.9%准确率
数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真IP定位准确一些。
ip2region的数据聚合自以下服务商的开放API或者数据(升级程序每秒请求次数2到4次):
- >80%, 淘宝IP地址库:http://ip.taobao.com/
- ≈10%, GeoIP:https://geoip.com/
- ≈2%, 纯真IP库:http://www.cz88.net/
ps:如果上述开放API或者数据都不给开放数据时ip2region将停止数据的更新服务。
标准化的数据格式
每条ip数据段都固定了格式:
城市Id|国家|区域|省份|城市|ISP
只有中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家(请忽略前面的城市Id,个人项目需求)。
体积小
包含了全部的IP,生成的数据库文件ip2region.db只有几MB,最小的版本只有1.5MB,随着数据的详细度增加数据库的大小也慢慢增大,目前还没超过8MB。
查询速度快
全部的查询客户端单次查询都在0.x毫秒级别,内置了三种查询算法
- memory算法:整个数据库全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。
- binary算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。
- b-tree算法:基于btree算法,基于ip2region.db文件,不需要载入内存,单词查询在0.x毫秒级别,比binary算法更快。
ps:任何客户端b-tree都比binary算法快,当然memory算法固然是最快的!
多查询客户端的支持
已经集成的客户端有:java、C#、php、c、python、nodejs、php扩展(php5和php7)、golang、rust、lua、lua_c, nginx。
maven集成
- 引入依赖
<!-- ip2region -->
<dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>1.7.2</version>
</dependency>
- 下载ip2region.db,下载链接:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.db
- 将ip2region.db放入项目中的src/main/resource文件夹下
- 编写工具类(内容参考”org.lionsoul.ip2region.test.TestSearcher.java“)
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.lionsoul.ip2region.Util;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;public class IPUtil {/*** 获取IP地址* @param request* @return*/public static String getIpAddr(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("X-Real-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}if ("0:0:0:0:0:0:0:1".equals(ip)) {ip = "127.0.0.1";}if (ip.split(",").length > 1) {ip = ip.split(",")[0];}return ip;}/*** 根据IP地址获取城市* @param ip* @return*/public static String getCityInfo(String ip) {URL url = IPUtil.class.getClassLoader().getResource("ip2region.db");File file;if (url != null) {file = new File(url.getFile());} else {return null;}if (!file.exists()) {System.out.println("Error: Invalid ip2region.db file, filePath:" + file.getPath());return null;}//查询算法int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree//DbSearcher.BINARY_ALGORITHM //Binary//DbSearcher.MEMORY_ALGORITYM //Memorytry {DbConfig config = new DbConfig();DbSearcher searcher = new DbSearcher(config, file.getPath());Method method;switch ( algorithm ){case DbSearcher.BTREE_ALGORITHM:method = searcher.getClass().getMethod("btreeSearch", String.class);break;case DbSearcher.BINARY_ALGORITHM:method = searcher.getClass().getMethod("binarySearch", String.class);break;case DbSearcher.MEMORY_ALGORITYM:method = searcher.getClass().getMethod("memorySearch", String.class);break;default:return null;}DataBlock dataBlock;if (!Util.isIpAddress(ip)) {System.out.println("Error: Invalid ip address");return null;}dataBlock = (DataBlock) method.invoke(searcher, ip);return dataBlock.getRegion();} catch (Exception e) {e.printStackTrace();}return null;}}
- main方法测试
public static void main(String[] args) {System.out.println(IPUtil.getCityInfo("113.105.172.33"));
}
运行结果:中国|华南|广东省|东莞市|电信
小坑
暂时遇到的坑是文件读取的问题,一开始写的是File file = new File(“src/main/resource/ip2region.db”),本地测试没问题,放到生产环境就找不到路径了,后面经过多次百度,改成上面代码那样,目前测试可以兼容生产环境和测试环境。
Java 根据IP地址获取城市(ip2region)相关推荐
- java根据ip地址获取城市地域信息
java根据ip地址获取城市地域信息 这里提供两个公开的接口,一个是阿里的,一个是新浪的 http://ip.taobao.com/service/getIpInfo.php?ip=123.139.9 ...
- java 根据ip地址获取城市_Java 根据ip地址获取当前城市
maxmind免费数据库maven位置:用来获取所要用的数据库文件(GeoLite2-City.mmdb) org.elasticsearch geolite2-databases 20151029 ...
- java使用高德地图根据IP地址获取城市
话不多说!直奔主题 既然是根据IP,首先肯定是先要获取IP地址的,以下代码是获取IP地址,部署到服务器上去后会获取到公网的IP不是服务器的本机IP:是通过HttpServletRequest获取 注: ...
- 前端获取自己所在的ip_前端使用js根据ip地址获取城市地理位置
标签: 前端使用js根据ip地址获取城市地理位置 一.使用js根据ip获取地址位置 1.在html页面,加入如下代码: var cityCode=returnCitySN.cid; document. ...
- 根据ip地址获取城市名的几种方法
2019独角兽企业重金招聘Python工程师标准>>> 在某些场景下,可能需要用到根据ip地址获取ip所对应的城市名. 貌似腾讯.百度等开放接口已经失效或者免费服务接口关闭等原因,很 ...
- java 根据IP地址获取地理位置
来源:http://www.ipplus360.com/tech/api/ 来源:http://blog.csdn.net/Cryhelyxx/article/details/40862101 精确查 ...
- java通过ip地址获取相应对应的城市
发现了一比较好的本地ip对应地址的库资源文件--做一下笔记. 官方网站 https://dev.maxmind.com/geoip/geoip2/geolite2/ 这里提供了免费的库文件,还有很好的 ...
- JAVA根据IP地址获取省份城市和经纬度(可获取国家名称 淘宝高德API如果是国外IP获取到的为空)
所需jar包maven地址: <!-- 根据ip获取位置 --><dependency><groupId>com.maxmind.geoip2</groupI ...
- 【转载】 java根据ip地址获取详细地域信息
互联网有很多接口可以实现通过ip查询到具体的位置,如下: 通过淘宝IP地址库获取IP位置 1. 请求接口(GET):http://ip.taobao.com/service/getIpInfo.php ...
最新文章
- 包含c语言的序列化字符,Android Serializable与Parcelable原理与区别
- java中自定义比较器_Java中的比较器:自定义规则!!!
- 使用Httpclient来替代客户端的jsonp跨域解决方案
- 宝塔部署node项目_宝塔面板部署 node.js 项目
- php下载文件添加header响应头
- Android API level 版本对应关系
- iOS APP中第三方APP调用自己的APP,打开文件
- z-buffer的概念和算法
- Java基础语法——Java语言介绍
- 如何自学VR虚拟现实技术?VR简单上手教程
- 【华为OD机试真题 JAVA】数字涂色
- 狼人杀游戏 数据库设计
- 带通滤波器幅频特性曲线图_滤波器知识,你所要的,都在这里
- 微信群里的这几类人,真让人想打他
- CSDN的markdown的KaTex数学公式
- windows与ipad互联传文件
- 数据和计算系统如何容错?
- CAP MAP VLR HLR GMSC DP gsmSSF简介
- 30万精英人才大迁徙:进军区块链,他们是赌徒还是信徒?
- Python项目实战学习 外星人入侵 创建外星人飞船并实现外星人动态移动效果
热门文章
- Vue axios 发送 get 和 post 请求
- 三星n9002 android7.0,三星-N9008V/N9002-LOS-安卓9.0.0-稳定版Stable3.0-来去电归属-农历等-本地化增强适配...
- UDS入门至精通系列:Service 22
- 就业感言:机遇永远是留给那些有准备的人
- 优酷路由宝TF异常问题
- ux设计工具_UX设计人员的5种视觉设计工具
- android 音视频同步_如何轻松地将音乐,视频和照片与Android同步
- C语言判断scanf输入的是否为整型,以及由此造成死循环的解决办法
- 释放云手机的想象力,百度是怎样出手的?
- 无方向盘!通用汽车宣布2019年生产无人驾驶汽车 | 消息