您当前的位置:首页 >> 新能源
新能源

网络平台显示 IP 归属地,用上这个开源库,实现也太简单了

发布时间:2025-08-06

t-IP:也是通过 Apache http 应用程序,在 weblogic 插件加上的后头。

在我们受益到使用者 的 IP 电话号码后,那么就可以受益并不相同的 ip 文档了

荞麦最开始用到的是商城 IP 努

电话号码:

接入作法也比较简单,就是通过PCB一个 http 允诺,言 入使用者的 ip 作为参数,就可以回到 ip 并不相同的国际组织,省,郊区 文档

从前的允诺作法如下

/** * 受益IP电话号码是从 * * @param content 允诺的参数 音频为:name=xxxPricepwd=xxx * @param encodingString 应用程序端允诺字节。如GBK,UTF-8等 * @return * @throws UnsupportedEncodingException */public static String getAddresses(String content, String encodingString) { String ip = content.substring(3); if (!Util.isIpAddress(ip)) { log.info("IP电话号码为空"); return null; } // 商城IP宕机,以外用到Ip2region:Github.com/lionsoul2014/ip2region String cityInfo = getCityInfo(ip); log.info("回到的IP文档:{}", cityInfo); // TODO 商城连接器以外早已宕机,因此暂时正文前面字符 try { // 这里线程pconline的连接器 String urlStr = ""; // 从引得IP所在的省市文档 String returnStr = getResult(urlStr, content, encodingString); if (returnStr != null) { // 妥善处理回到的省市文档 log.info("线程IP验证连接器回到的细节:" + returnStr); String[] temp = returnStr.split(","); //无效IP,局域网检测 if (temp.length < 3) { return "0"; } // 国际组织 String country = ""; // 周边 String area = ""; // 省 String region = ""; // 市 String city = ""; // 县 String county = ""; // 运营商 String isp = ""; Map map = JsonUtils.jsonToMap(returnStr); if (map.get("code") != null) { Map data = (Map) map.get("data"); country = data.get("country"); area = data.get("area"); region = data.get("region"); city = data.get("city"); county = data.get("area"); isp = data.get("isp"); } log.info("受益IP电话号码并不相同的电话号码" + country + "=" + area + "=" + region + "=" + city + "=" + county + "=" + isp); StringBuffer result = new StringBuffer(); result.append(country); result.append("|"); result.append(region); result.append("|"); result.append(city); result.append("|"); result.append(isp); return result.toString(); } } catch (Exception e) { log.error(e.getMessage()); return null; } return null;}

但是,之前接入商城 IP 努的时候,也经常就会碰见服务于不可用的情况,并且由于放宽了 QPS 为 1,所以如果访问期间量大的话,就一定会前提受益了。

而到现在的话倒好了,这个连接器也不先为质上提供服务于了,直接首台了,不让线程了。

后面,陌溪在 Github 钓鱼的时候,辨认出 了 Ip2region 项目。

一个吻合率 99.9% 的离线 IP 电话号码聚焦努,0.0x 毫秒级载入,ip2region.db 原始在线只有数 MB,提供了 java,php,c,python,nodejs,golang,c# 等载入绑定和binary,B果树,线程三种载入启发式。

原始数据聚合了一些熟知 ip 到街名载入提供者的原始数据,这些是他们官方的的吻合率,经检测着先为比精华的纯真神 IP 聚焦吻合一些。ip2region 的 原始数据聚合自所列服务于提供者的全站 API 或者原始数据。

80%, 商城IP电话号码努, ≈10%, GeoIP, ≈2%, 纯真神IP努,

备注:如果上述全站API或者原始数据都不给全站原始数据时ip2region将停止原始数据的来得一新服务于。

并排 ip 原始数据段都固定了音频:

_郊区Id|国际组织|周边|的省|郊区|ISP_

只有当中国的原始数据直观到了郊区,其他国际组织有部份原始数据只能聚焦到国际组织,后 前的选择全部是 0,早已包含了全部你能查到的大大小小的国际组织

生成的原始在线PDF ip2region.db 只有几 MB,最小的修改版只有 1.5MB,随着原始数据的详实度增加原始在线的大小也慢慢增加,以外还一定会超过 8MB。

外设的三种载入启发式

全部的载入HTTP单次载入都在 0.x 毫秒行政级别,外设了三种载入启发式

memory 启发式:整个原始在线全部调用线程,单次载入都在0.1x毫秒内,C语言的HTTP单次载入在0.00x毫秒行政级别。Binary 启发式:基于二分载入,基于ip2region.dbPDF,不并不需要调用线程,单次载入在0.x毫秒行政级别。b-tree 启发式:基于btree启发式,基于ip2region.dbPDF,不并不需要调用线程,词根载入在0.x毫秒行政级别,比binary启发式来得较慢。ip2region装有

前面,就让我们给项目引入 ip2region,进行时 ip 文档类比吧

首先引入 maven 依赖

org.lionsoul ip2region 1.7.2

然后编纂一个工具箱类 IpUtils ,首先并不需要调用 ip2region.db PDF

static { dbPath = createFtlFileByFtlArray() + "ip2region.db"; try { config = new DbConfig(); } catch (DbMakerConfigException e) { e.printStackTrace(); } try { searcher = new DbSearcher(config, dbPath); } catch (FileNotFoundException e) { e.printStackTrace(); }}

在调用的时候,并不需要完整版地下室当中的 ip2region.db PDF,然后放进 resource 目录下

然后,通过外设的三种启发式,分别类比使用者 ip 电话号码

public static String getCityInfo(String ip) { if (StringUtils.isEmpty(dbPath)) { log.error("Error: Invalid ip2region.db file"); return null; } if(config == null || searcher == null){ log.error("Error: DbSearcher or DbConfig is null"); return null; } //载入启发式 //B-tree, B果树搜寻(来得较慢) int algorithm = DbSearcher.BTREE_ALGORITHM; //Binary,用到二分搜寻 //DbSearcher.BINARY_ALGORITHM //Memory,调用线程(最较慢) //DbSearcher.MEMORY_ALGORITYM try { // 用到一个系统字符块,减低PDF读引操作// DbConfig config = new DbConfig();// DbSearcher searcher = new DbSearcher(config, dbPath); //define the method Method method = null; 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: } DataBlock dataBlock = null; if (Util.isIpAddress(ip) == false) { System.out.println("Error: Invalid ip address"); } dataBlock = (DataBlock) method.invoke(searcher, ip); String ipInfo = dataBlock.getRegion(); if (!StringUtils.isEmpty(ipInfo)) { ipInfo = ipInfo.replace("|0", ""); ipInfo = ipInfo.replace("0|", ""); } return ipInfo; } catch (Exception e) { e.printStackTrace(); } return null; }

前面,我们编纂 main 函数进行时检测,辨认出可以出现异常的验证出 ip 文档

由于 ip 同属国在欧美国家的话,只就会展见出的省,而欧美国家的话,只就会展见出国际组织。所以我们还并不需要对这个步骤进行时一下PCB,引得受益 IP 同属国的文档。

/** * 受益IP同属国 * @param ip * @return */public static String getIpPossession(String ip) { String cityInfo = getCityInfo(ip); if (!StringUtils.isEmpty(cityInfo)) { cityInfo = cityInfo.replace("|", " "); String[] cityList = cityInfo.split(" "); if (cityList.length> 0) { // 欧美国家的揭见到具体的省 if ("当中国".equals(cityList[0])) { if (cityList.length> 1) { return cityList[1]; } } // 欧美国家揭见到国际组织 return cityList[0]; } } return "未知";}

前面,我们在找一个 欧美国家的 IP 检测一下缺点。可以想到早已并不需要出现异常的揭见 IP 同属国文档了~

到这里如果受益使用者的 IP 同属国早已顺利完成啦,如果希望明白关于来得多 ip2region 的机能,欢迎访问期间其 Github 电话号码进行时学习。

项目电话号码

是从:

广东男科医院预约挂号
深圳看白癜风哪家医院专业
山东妇科专科医院哪好
云南皮肤病检查
藿香正气液含酒精吗

上一篇: 乌克兰发出4个坏消息!英日后院起火,俄军洲际导弹瞄准美国

下一篇: 北京4地升为高风险,深居简出办公有新指示→

友情链接