范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  细心的小伙伴可能会发现,最近蘑菇新上线了  IP  属地的功能,小伙伴在发表动态、发表评论以及聊天的时候,都会显示自己的  IP  属地信息
  动态显示IP属地
  在蘑菇群聊中,也 可 以 展 示 IP 属 地,下面是小伙伴们在交流群中显示的
  下面,我就来讲讲, Java  中是如何获取  IP  属地的,主要分为以下几步  通过 HttpServletRequest 对象,获 取 用户的  IP  地址 通过 IP 地址,获取对应的省份、城市
  首先需要写一个  IP  获取的工具类,因为每一次用户的  Request  请 求,都会携带上请求的  IP  地 址放到请求头中。  public class IpUtil {     public static String getIpAddr(ServerHttpRequest request) {         HttpHeaders headers = request.getHeaders();         String ipAddress = headers.getFirst("X-Forwarded-For");         if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {             ipAddress = headers.getFirst("Proxy-Client-IP");         }         if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {             ipAddress = headers.getFirst("WL-Proxy-Client-IP");         }         if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {             ipAddress = request.getRemoteAddress().getAddress().getHostAddress();             if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) {                 // 根据网卡取本机配置的IP                 try {                     InetAddress inet = InetAddress.getLocalHost();                     ipAddress = inet.getHostAddress();                 } catch (UnknownHostException e) {                     log.error("根据网卡获取本机配置的IP异常", e);                 }              }         }          // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照","分割         if (ipAddress != null && ipAddress.indexOf(",") > 0) {             ipAddress = ipAddress.split(",")[0];         }          return ipAddress;     } }
  这里有三个名词,分别是  X-Forwarded-For :一个 HTTP  扩展头部,主要是为了让 Web  服务器获取访问用户的真 实 IP  地址。每个 IP  地址,每个值通过逗号+空格分开,最左边是最原始客户端的 IP  地址,中间如果有多层代理,每 层代理会将连接它的客户端 IP  追加在 X-Forwarded-For  右边。 X-Real-IP :一般只记录真实发出请求的客户端IP Proxy-Client-IP :这个一般是经过 Apache http  服务器的请求才会有,用 Apache http  做代理时一般会加上 Proxy-Client-IP  请求头 WL-Proxy-Client-IP :也是通过 Apache http 服务器,在 weblogic  插件加上的头。
  在我们获取到用户 的  IP  地址后,那么就可以获取对应的  ip  信息了
  蘑菇最开始使用的是淘宝  IP  库
  地址:https://ip.taobao.com/
  接入方式也比较简单,就是通过封装一个  http  请求,传 入用户的  ip  作为参数,就可以返回  ip  对应的国家,省,城市 信息
  原来的请求方式如下  /**  * 获取IP地址来源  *  * @param content        请求的参数 格式为:name=xxx&pwd=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:https://github.com/lionsoul2014/ip2region     String cityInfo = getCityInfo(ip);     log.info("返回的IP信息:{}", cityInfo);      // TODO 淘宝接口目前已经宕机,因此暂时注释下面代码     try {         // 这里调用pconline的接口         String urlStr = "http://ip.taobao.com/service/getIpInfo.php";         // 从http://whois.pconline.com.cn取得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地址库, http://ip.taobao.com/   10%, GeoIP, https://geoip.com/   2%, 纯真IP库, http://www.cz88.net/
  备注  :如果上述开放API或者数据都不给开放数据时ip2region将停止数据的更新服务。
  每条  ip  数据段都固定了格式:  _城市Id|国家|区域|省份|城市|ISP_
  只有中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后 前的选项全部是  0 ,已经包含了全部你能查到的大大小小的国家
  生成的数据库文件  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算法更快。 ip2region安装
  下面,就让我们给项目引入  ip2region ,进行  ip  信息转换吧
  首先引入  maven  依赖       org.lionsoul     ip2region     1.7.2 
  然后编写一个工具类  IpUtils  ,首先需要加载  ip2region.db  文件  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  文件,然后放到  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 {             // 使用静态代码块,减少文件读取操作 //            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 属地在国内的话,只会展示省份,而国外的话,只会展示国家。所以我们还需要对这个方法进行一下封装,得到获取 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  地址进行学习。  项目地址
  https://github.com/lionsoul2014/ip2region
  来源:https://mp.weixin.qq.com/s/GcgvqlvtklUrT2mB7fI-rQ

有外星飞船曾经闯入太阳系?为了一探究竟,科学家们准备追上它随着天文探索技术的飞速发展,探索地外生命已经成为天文探测领域中的一项重要内容,无论是应用大型天文望远镜,还是发射深空探测器,都会把目标的天体或者星际空间所具有的一些基本特征,与地球嫦娥五号带回宝贵资源,1吨价值30亿美元,100吨够全球用一年自然杂志发表的一项新研究表示,中国科学家对嫦娥五号带回来的月壤进行了结构分析,同位素测量结果表明其年龄为20。3亿年,补齐了月球年代函数的空白。据了解,美国通过阿波罗计划带回了大量Mac微信发布3。3。1正式版近期,Mac微信发布了3。3。1正式版。根据文件显示,这次的更新仅修复了一些已知问题,上面也并没有提到任何新功能。随后我也更新看了一下,确实没有发现里面有什么变化。最近更新Mac微华为P60Pro曝光,2K屏幕支持5G网络,华为P60Pro将会搭载麒麟芯片就在近日,华为P60Pro已经被曝光了,这次华为P60Pro在硬件配置上将会有所突破,其中5G射频技术问题会得到解决,另外麒麟芯片可能也会重新生产,有消息表明华为手机将会重磅回归,新款iPhoneSE正式发布,搭载A15芯片,国行售价3499元起3月9日消息,苹果在凌晨举办的春季发布会上正式发布了全新的iPhoneSE,这一款官方称是采用经典设计的强大智能手机。在设计方面,这一款iPhoneSE延续了上一代iPhoneSE衡越从赵本山爱将沦为被骗财骗色,离异生子后晚年节目上诉现状刘老根宣传海报下一个!下一个!录影棚里不断播放着不同歌手演唱的小样。2001年,电视剧刘老根片尾曲主唱人选的征集已经进入最后阶段。曲作者杨柏森把录制好的小样拿给赵本山听,由他来确定黄渤隐藏22年的妻子曝光!原来是我们的老熟人,怪不得不娶林志玲现在进入娱乐圈的都是以偶像形象出现在观众面前的,很少有人是以谐星形象出现在人们的视线中,可能是因为谐星的路比较难走吧,不好出名,不如偶像挣的钱多,成名快。不过娱乐圈也不是凭借一张脸大S说生米已煮成了熟饭,先爱了再说,跟余秀华的名言有一拼这两天娱乐圈爆了一个大瓜,刚刚和汪小菲离婚几个月的大S徐熙媛,突然官宣她又结婚了,对方是一位叫具俊晔的52岁的韩国欧巴。这个瓜又香又甜,让一帮粉粉吃得过瘾。大S面对媒体笑眯了眼,直蛋白质是鸡蛋的3倍,牛奶的12倍,孩子多吃它,春天长个快春天到了,万物苏醒,一年之计在于春,尤其是对于生长发育期的孩子,在这个季节注意营养的摄入,为一年的健康打下基础!春天欣欣向荣,适合多吃植物性食物,在所有植物性食物中,只有黄豆的高蛋宽肩ampampamp溜肩最好看的3种穿法Hi,小姐妹们好!这里是你们的小萌主!说到仪态问题,萌主脑子里第一反应就是奥黛丽赫本,高贵优雅这些词感觉都概括不了她的气质,女神我好爱!!!特别是穿这种露肩小礼服,气场满分。肩膀线风衣打底裤早就过时了!今年流行这4种风衣搭配,显瘦又好看最近的温度是我认为最舒适的,凉爽又不闷热,穿搭既可以打造叠穿的时髦,又可以造就单穿的随性,说到穿搭呢,春季自然是离不开风衣单品的。风衣给人的感觉就是飒爽帅气,是女性打造气质穿搭必不
夜读今年的遗憾就止于今年吧头号解忧馆有人拿命谈了五六年的轰轰烈烈的恋爱,最后也没有有情人终成眷属,也没能结婚有些人只认识了十天半个月就订了,婚姻中的孰是孰非,谁又能看破,谁又能说得清呢?或许只有经历过了,才刘永健舌尖上的童年舌尖上的童年文刘永健我的童年是物质贫乏的时代,但也不乏美味。夏季白天总是很无奈的长。每当我喊饿的时候,我那裹着小脚的曾祖母就点柴生火,等锅烧热,放入一点黑油(棉花籽榨的油),油热放2023年总台春晚吉祥物兔圆圆正式亮相,充满动感活力记者师文静12月22日,以欣欣向荣的新时代中国,日新月异的更美好生活为主题的中央广播电视总台2023年春节联欢晚会,正式发布官方标识和吉祥物形象兔圆圆。央视新闻报道称,兔圆圆很萌很不加硬件,怎样一套鼠标控制两台电脑今天给大家介绍一款微软爸爸推出的软件,不需要任何硬件,只要在同一局域网内就可以用一套鼠标键盘控制几台电脑。今天我要介绍的这款软件叫MousewithoutBorders(微软无界鼠YOGAPaper墨水平板来一场阅读和书写的双向奔赴当短视频风潮铺天盖地而来的时候,有多少人还能沉得下心完完整整地读完一整本书,用手机或者普通平板阅读,容易被各种APP弹出来的消息转移注意力,然后就忘了出发的原因了。YOGAPape那些有趣的app(第五弹)1岛读适合碎片化阅读的app涨知识指数支持iPhoneAndroid岛读是一款极简主义的每日阅读应用。画面极简干净,每天只推送一篇文章,篇幅较短质量上乘,以日历化的形式来推送文章,假如人一辈子不吸烟不喝酒,会不会活得更久呢?转给家人看看吧我们身边的人或者是医生专家等,一直强调大家尽早戒烟戒酒。但是有些长期吸烟的人却也活到了90多岁,而不吸烟不喝酒的人,甚至中年就离世了。这不就说明吸烟喝酒反而更有助于健康长寿吗?如果甲亢的危害,可能比你想象的更加严重!在甲状腺疾病中,很多人都知道甲减的危害是非常大的,但是对于甲亢的危害却不是很清楚,其实甲亢对人的危害是不容小觑的,那么,甲亢到底有哪些危害呢?甲亢患者在平时应该注意哪些问题呢?今天阳了后怎么办?不要慌,可以多喝这3款茶,润喉止渴,好处多有人开玩笑说,目前国内分为2种人,一种是在家已经阳了的,一种是在家等阳的,虽然这个说法有点夸张,但也是事实。随着现在全面放开,国内感染的人数也在不断增加,一时之间搞得人心惶惶。其实鼻炎就是肺罢工了,一味苍耳子为药引,消除患者10年鼻炎鼻炎就是肺生病了,我以苍耳子为药引,消除患者10年鼻炎,我明白无能的不是中医,而是见钱眼开的医生我祖辈历代从医,他们教我如何治病救人,如何有医德,却没教过我怎么做生意,而我凭良心治家中常备五种中成药,小病不求人,不用总往医院跑今天给大家分享五个家中常备的中成药,有病不用老往医院跑。中成药便宜好用,经济实惠,携带方便,不用煎煮,自己在家就可以辨证使用,受到很多朋友的喜爱。下面我就从上火补肾祛湿腰腿疼痛疏肝