根据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次):

  1. >80%, 淘宝IP地址库:http://ip.taobao.com/
  2. ≈10%, GeoIP:https://geoip.com/
  3. ≈2%, 纯真IP库:http://www.cz88.net/

ps:如果上述开放API或者数据都不给开放数据时ip2region将停止数据的更新服务。

标准化的数据格式

每条ip数据段都固定了格式:

城市Id|国家|区域|省份|城市|ISP

只有中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家(请忽略前面的城市Id,个人项目需求)。

体积小

包含了全部的IP,生成的数据库文件ip2region.db只有几MB,最小的版本只有1.5MB,随着数据的详细度增加数据库的大小也慢慢增大,目前还没超过8MB。

查询速度快

全部的查询客户端单次查询都在0.x毫秒级别,内置了三种查询算法

  1. memory算法:整个数据库全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。
  2. binary算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。
  3. 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集成

  1. 引入依赖
<!-- ip2region -->
<dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>1.7.2</version>
</dependency>
  1. 下载ip2region.db,下载链接:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.db
  2. 将ip2region.db放入项目中的src/main/resource文件夹下
  3. 编写工具类(内容参考”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;}}
  1. 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)相关推荐

  1. java根据ip地址获取城市地域信息

    java根据ip地址获取城市地域信息 这里提供两个公开的接口,一个是阿里的,一个是新浪的 http://ip.taobao.com/service/getIpInfo.php?ip=123.139.9 ...

  2. java 根据ip地址获取城市_Java 根据ip地址获取当前城市

    maxmind免费数据库maven位置:用来获取所要用的数据库文件(GeoLite2-City.mmdb) org.elasticsearch geolite2-databases 20151029 ...

  3. java使用高德地图根据IP地址获取城市

    话不多说!直奔主题 既然是根据IP,首先肯定是先要获取IP地址的,以下代码是获取IP地址,部署到服务器上去后会获取到公网的IP不是服务器的本机IP:是通过HttpServletRequest获取 注: ...

  4. 前端获取自己所在的ip_前端使用js根据ip地址获取城市地理位置

    标签: 前端使用js根据ip地址获取城市地理位置 一.使用js根据ip获取地址位置 1.在html页面,加入如下代码: var cityCode=returnCitySN.cid; document. ...

  5. 根据ip地址获取城市名的几种方法

    2019独角兽企业重金招聘Python工程师标准>>> 在某些场景下,可能需要用到根据ip地址获取ip所对应的城市名. 貌似腾讯.百度等开放接口已经失效或者免费服务接口关闭等原因,很 ...

  6. java 根据IP地址获取地理位置

    来源:http://www.ipplus360.com/tech/api/ 来源:http://blog.csdn.net/Cryhelyxx/article/details/40862101 精确查 ...

  7. java通过ip地址获取相应对应的城市

    发现了一比较好的本地ip对应地址的库资源文件--做一下笔记. 官方网站 https://dev.maxmind.com/geoip/geoip2/geolite2/ 这里提供了免费的库文件,还有很好的 ...

  8. JAVA根据IP地址获取省份城市和经纬度(可获取国家名称 淘宝高德API如果是国外IP获取到的为空)

    所需jar包maven地址: <!-- 根据ip获取位置 --><dependency><groupId>com.maxmind.geoip2</groupI ...

  9. 【转载】 java根据ip地址获取详细地域信息

    互联网有很多接口可以实现通过ip查询到具体的位置,如下: 通过淘宝IP地址库获取IP位置 1. 请求接口(GET):http://ip.taobao.com/service/getIpInfo.php ...

最新文章

  1. 包含c语言的序列化字符,Android Serializable与Parcelable原理与区别
  2. java中自定义比较器_Java中的比较器:自定义规则!!!
  3. 使用Httpclient来替代客户端的jsonp跨域解决方案
  4. 宝塔部署node项目_宝塔面板部署 node.js 项目
  5. php下载文件添加header响应头
  6. Android API level 版本对应关系
  7. iOS APP中第三方APP调用自己的APP,打开文件
  8. z-buffer的概念和算法
  9. Java基础语法——Java语言介绍
  10. 如何自学VR虚拟现实技术?VR简单上手教程
  11. 【华为OD机试真题 JAVA】数字涂色
  12. 狼人杀游戏 数据库设计
  13. 带通滤波器幅频特性曲线图_滤波器知识,你所要的,都在这里
  14. 微信群里的这几类人,真让人想打他
  15. CSDN的markdown的KaTex数学公式
  16. windows与ipad互联传文件
  17. 数据和计算系统如何容错?
  18. CAP MAP VLR HLR GMSC DP gsmSSF简介
  19. 30万精英人才大迁徙:进军区块链,他们是赌徒还是信徒?
  20. Python项目实战学习 外星人入侵 创建外星人飞船并实现外星人动态移动效果

热门文章

  1. Vue axios 发送 get 和 post 请求
  2. 三星n9002 android7.0,三星-N9008V/N9002-LOS-安卓9.0.0-稳定版Stable3.0-来去电归属-农历等-本地化增强适配...
  3. UDS入门至精通系列:Service 22
  4. 就业感言:机遇永远是留给那些有准备的人
  5. 优酷路由宝TF异常问题
  6. ux设计工具_UX设计人员的5种视觉设计工具
  7. android 音视频同步_如何轻松地将音乐,视频和照片与Android同步
  8. C语言判断scanf输入的是否为整型,以及由此造成死循环的解决办法
  9. 释放云手机的想象力,百度是怎样出手的?
  10. 无方向盘!通用汽车宣布2019年生产无人驾驶汽车 | 消息