应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

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

  细心的小伙伴可能会发现,最近蘑菇新上线了IP属地的功能,小伙伴在发表动态、发表评论以及聊天的时候,都会显示自己的IP属地信息
  动态显示IP属地
  在蘑菇群聊中,也可以展示IP属地,下面是小伙伴们在交流群中显示的
  下面,我就来讲讲,Java中是如何获取IP属地的,主要分为以下几步通过HttpServletRequest对象,获取用户的IP地址通过IP地址,获取对应的省份、城市
  首先需要写一个IP获取的工具类,因为每一次用户的Request请求,都会携带上请求的IP地址放到请求头中。publicclassIpUtil{publicstaticStringgetIpAddr(ServerHttpRequestrequest){HttpHeadersheadersrequest。getHeaders();StringipAddressheaders。getFirst(XForwardedFor);if(ipAddressnullipAddress。length()0unknown。equalsIgnoreCase(ipAddress)){ipAddressheaders。getFirst(ProxyClientIP);}if(ipAddressnullipAddress。length()0unknown。equalsIgnoreCase(ipAddress)){ipAddressheaders。getFirst(WLProxyClientIP);}if(ipAddressnullipAddress。length()0unknown。equalsIgnoreCase(ipAddress)){ipAddressrequest。getRemoteAddress()。getAddress()。getHostAddress();if(ipAddress。equals(127。0。0。1)ipAddress。equals(0:0:0:0:0:0:0:1)){根据网卡取本机配置的IPtry{InetAddressinetInetAddress。getLocalHost();ipAddressinet。getHostAddress();}catch(UnknownHostExceptione){log。error(根据网卡获取本机配置的IP异常,e);}}}对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照,分割if(ipAddress!nullipAddress。indexOf(,)0){ipAddressipAddress。split(,)〔0〕;}returnipAddress;}}
  这里有三个名词,分别是XForwardedFor:一个HTTP扩展头部,主要是为了让Web服务器获取访问用户的真实IP地址。每个IP地址,每个值通过逗号空格分开,最左边是最原始客户端的IP地址,中间如果有多层代理,每层代理会将连接它的客户端IP追加在XForwardedFor右边。XRealIP:一般只记录真实发出请求的客户端IPProxyClientIP:这个一般是经过Apachehttp服务器的请求才会有,用Apachehttp做代理时一般会加上ProxyClientIP请求头WLProxyClientIP:也是通过Apachehttp服务器,在weblogic插件加上的头。
  在我们获取到用户的IP地址后,那么就可以获取对应的ip信息了
  蘑菇最开始使用的是淘宝IP库
  地址:https:ip。taobao。com
  接入方式也比较简单,就是通过封装一个http请求,传入用户的ip作为参数,就可以返回ip对应的国家,省,城市信息
  原来的请求方式如下获取IP地址来源paramcontent请求的参数格式为:namexxxpwdxxxparamencodingString服务器端请求编码。如GBK,UTF8等returnthrowsUnsupportedEncodingExceptionpublicstaticStringgetAddresses(Stringcontent,StringencodingString){Stringipcontent。substring(3);if(!Util。isIpAddress(ip)){log。info(IP地址为空);returnnull;}淘宝IP宕机,目前使用Ip2region:https:github。comlionsoul2014ip2regionStringcityInfogetCityInfo(ip);log。info(返回的IP信息:{},cityInfo);TODO淘宝接口目前已经宕机,因此暂时注释下面代码try{这里调用pconline的接口StringurlStrhttp:ip。taobao。comservicegetIpInfo。php;从http:whois。pconline。com。cn取得IP所在的省市区信息StringreturnStrgetResult(urlStr,content,encodingString);if(returnStr!null){处理返回的省市区信息log。info(调用IP解析接口返回的内容:returnStr);String〔〕tempreturnStr。split(,);无效IP,局域网测试if(temp。length3){return0;}国家Stringcountry;区域Stringarea;省Stringregion;市Stringcity;县Stringcounty;运营商Stringisp;MapString,ObjectmapJsonUtils。jsonToMap(returnStr);if(map。get(code)!null){MapString,Stringdata(MapString,String)map。get(data);countrydata。get(country);areadata。get(area);regiondata。get(region);citydata。get(city);countydata。get(area);ispdata。get(isp);}log。info(获取IP地址对应的地址countryarearegioncitycountyisp);StringBufferresultnewStringBuffer();result。append(country);result。append();result。append(region);result。append();result。append(city);result。append();result。append(isp);returnresult。toString();}}catch(Exceptione){log。error(e。getMessage());returnnull;}returnnull;}
  但是,之前接入淘宝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。com10,GeoIP,https:geoip。com2,纯真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毫秒级别。btree算法:基于btree算法,基于ip2region。db文件,不需要载入内存,单词查询在0。x毫秒级别,比binary算法更快。ip2region安装
  下面,就让我们给项目引入ip2region,进行ip信息转换吧
  首先引入maven依赖dependencygroupIdorg。lionsoulgroupIdip2regionartifactIdversion1。7。2versiondependency
  然后编写一个工具类IpUtils,首先需要加载ip2region。db文件static{dbPathcreateFtlFileByFtlArray()ip2region。db;try{confignewDbConfig();}catch(DbMakerConfigExceptione){e。printStackTrace();}try{searchernewDbSearcher(config,dbPath);}catch(FileNotFoundExceptione){e。printStackTrace();}}
  在加载的时候,需要下载仓库中的ip2region。db文件,然后放到resource目录下
  然后,通过内置的三种算法,分别转换用户ip地址publicstaticStringgetCityInfo(Stringip){if(StringUtils。isEmpty(dbPath)){log。error(Error:Invalidip2region。dbfile);returnnull;}if(confignullsearchernull){log。error(Error:DbSearcherorDbConfigisnull);returnnull;}查询算法Btree,B树搜索(更快)intalgorithmDbSearcher。BTREEALGORITHM;Binary,使用二分搜索DbSearcher。BINARYALGORITHMMemory,加载内存(最快)DbSearcher。MEMORYALGORITYMtry{使用静态代码块,减少文件读取操作DbConfigconfignewDbConfig();DbSearchersearchernewDbSearcher(config,dbPath);definethemethodMethodmethodnull;switch(algorithm){caseDbSearcher。BTREEALGORITHM:methodsearcher。getClass()。getMethod(btreeSearch,String。class);break;caseDbSearcher。BINARYALGORITHM:methodsearcher。getClass()。getMethod(binarySearch,String。class);break;caseDbSearcher。MEMORYALGORITYM:methodsearcher。getClass()。getMethod(memorySearch,String。class);break;default:}DataBlockdataBlocknull;if(Util。isIpAddress(ip)false){System。out。println(Error:Invalidipaddress);}dataBlock(DataBlock)method。invoke(searcher,ip);StringipInfodataBlock。getRegion();if(!StringUtils。isEmpty(ipInfo)){ipInfoipInfo。replace(0,);ipInfoipInfo。replace(0,);}returnipInfo;}catch(Exceptione){e。printStackTrace();}returnnull;}
  下面,我们编写main函数进行测试,发现可以正常的解析出ip信息
  由于ip属地在国内的话,只会展示省份,而国外的话,只会展示国家。所以我们还需要对这个方法进行一下封装,得到获取IP属地的信息。获取IP属地paramipreturnpublicstaticStringgetIpPossession(Stringip){StringcityInfogetCityInfo(ip);if(!StringUtils。isEmpty(cityInfo)){cityInfocityInfo。replace(,);String〔〕cityListcityInfo。split();if(cityList。length0){国内的显示到具体的省if(中国。equals(cityList〔0〕)){if(cityList。length1){returncityList〔1〕;}}国外显示到国家returncityList〔0〕;}}return未知;}
  下面,我们在找一个国外的IP测试一下效果。可以看到已经能够正常的显示IP属地信息了
  到这里如果获取用户的IP属地已经完成啦,如果想要了解关于更多ip2region的功能,欢迎访问其Github地址进行学习。项目地址
  https:github。comlionsoul2014ip2region
  来源:https:mp。weixin。qq。comsGcgvqlvtklUrT2mB7fIrQ

上海海昌海洋公园度假酒店中餐厅领班傅朱良希望新的一年游客多多傅朱良(上海海昌海洋公园度假酒店中餐厅领班):过去的这一年,对我来说印象深刻。身为一名酒店人,我们实在太难了!印象最深的是上半年,上海因疫情原因经历了3个月的封控管理,而……江川路街道闵行开发区第三届电竞邀请赛落幕头图为比赛现场受访对象供图日前,江川路街道闵行开发区第三届电竞邀请赛落下帷幕,此次比赛由闵行开发区工会联合江川路街道总工会共同举办,是区域化工建的一次积极探索和实践。……八语下第19课登勃朗峰马克。吐温原文诵读知识点课件习题【原文】登勃朗峰。马克。吐温前往勃朗峰的途中,我们先坐火车去了马蒂尼,翌日早晨八点多,便徒步出发。路上有很多人结伴而行,乘坐马车的,骑骡的因而扬起阵阵尘埃。队伍分散……1941年的江苏徐州,魁星阁周边景色怡人,开元寺古佛像栩栩如江苏徐州古称彭城,是一座山川秀丽、古物众多的古老城市。日本侵华期间,这座古老的城市也没能幸免于难。1938年5月19日,日本侵略者的铁蹄踏入徐州。本组图片真实记录了徐州沦……毛戈平鱼子气垫新升级!自带防晒力,打造原生好皮丨种草机毛戈平(MAOGEPING)的鱼子气垫一直是我常年钟爱的单品,不管是妆感、遮瑕力、服帖度、养肤性都让我感觉无可挑剔。但进入春夏之后,防晒成为了我的刚需,特别是补妆的时候,……现在越来越多曲面屏手机,买曲面屏手机好不好?在多年以前,曲面屏手机就已经面世,这类手机边缘是弯曲并且有一定弧度的,能够提高屏占比,带来更沉浸式的观感体验,但那会技术并没有成熟,只有在一些高端机型中出现,而随着技术慢慢完善……华硕ROG游戏手机7照片曝光IT之家3月30日消息,华硕ROG官方宣布ROG7系列游戏手机新品发布会定档4月13日20:00,可靠消息源SnoopyTech分享了该机的真机图片。据微博博主数码闲聊站……尖刀向内,阿里再造阿里3月末,烟雨江南,位于杭州的阿里巴巴总部樱花绽放,粉白花朵交映在风中。正是江南好风景,落花时节又逢君。曾在日本、泰国等地现身的阿里巴巴集团创始人马云突然回国。隔日,阿里再……济南经三路皇宫照相馆见证百年商埠历史,坚守照相技艺精神你知道吗?在大观园街道经三路108号,坐落着济南自开商埠以来最早的照相馆,皇宫照相馆。这里是老济南人自己的时光承载机,1932年由济南历城人张鸿文创办,开业至今已有91年,是迄……美媒将活塞队史最强的30人划分成五档,哪些球员被高估或低估了最近伊塞亚托马斯频繁在节目中露面,他对迈克尔乔丹也是进行了一些批评,特别是迈克尔乔丹在最后一舞纪录片中的言论,认为迈克尔乔丹在夸大自己,贬低他人。表示底特律活塞当时的球员,都击……有那么一刹那,我觉得自己像个生殖器!女性自述亲爱的兄弟姐妹,早上好,我是抱抱猫知识动漫,接到粉丝反映,女性在生育孩子后很容易出现抑郁症状,这种情况被称为产后抑郁症。虽然产后抑郁症很常见,但却往往被忽视。许多女性因为害怕被……谈谈以拍摄中国而闻名的西方电影大师伊文思作者:乔纳森罗森鲍姆译者:鸢尾花校对:易二三来源:TheChicagoReader(1992年5月29日)本片的主角这位老者生于上个世纪末,出生于一个人……
3万元左右的复刻军表天花板,非它莫属军表和我们平常看到的普通手表是不一样的,它在诞生之初专门服务于军方,所以必须适应各种恶劣环境,对防磁防水等性能也就有非常严苛的要求。发展到今天,军表变得越来越常见,很多腕表品牌……私募实控人违规炒股被罚超3000万,两家私募牵涉其中,发生了界面新闻记者穆玥界面新闻编辑近期,证监会公布的一则行政处罚决定书显示,浙江比特资产实控人、原执行董事李勇因控制账户组超比例持股及限制期交易陕西金叶,合计被处罚305……下一代iPhone上的静音按钮将被取代,改为触摸按压式按键3月4日,消息称iPhone15Pro和iPhone15PorMax两款机型将进行一些设计更改,包括音量键、静音键以及电源键都将调整,本篇文章为您详细介绍。静音开关静音按……再善良,也不要帮别人这4个忙善良是人的本性,也是一种可贵的品质。不过,人心是复杂的,人性也是多样的。虽然行善是一件好事,但择善而行也是一种美德,适可而止更是一种智慧。因此,实用菌温馨提醒……准妈妈注意啦!如何预防孕期贫血啊。。。哈。。。困。。。,上午10点,怀孕第10周的张女士在工位上伸了个懒腰。张小姐自从知晓怀孕以来,为了胎宝宝的健康成长,她已经戒掉了熬夜刷手机的习惯。几乎是按照教科书……怀斯曼237仍无缘今日最佳,对不起,全能战士巴特勒创奇迹了20222023赛季NBA常规赛正在如火如荼的进行中,2月28日比赛结束后,来看下今日赛况以及各队球员数据之最:活塞106117不敌黄蜂黄蜂首节就轰出了一波惊人的3……路透社硅谷巨头脸书母公司被意大利薅羊毛面临8亿欧元巨额税单中国小康网02月23日讯老马两位直接了解此事的消息人士周三说,Facebook(脸书)母公司Meta(META。O)在检察官对该公司展开调查后,在意大利面临约8。7亿欧元(9。……华为nova11Pro加快进程,北斗卫星鸿蒙3。1,强大了不在国产手机品牌中,真正跻身于全球市场、能和三星iPhone竞争的是华为,但大家也知道,因为一些特殊原因,华为手机的全球销量受阻。不过从去年下半年开始,华为Mate50系列发布之……这一数据连续9年居世界第一!邮政快递业晒出2022成绩单我国已建成世界规模最大的邮政快递网络。1月17日,2023年全国邮政管理工作会议在京召开,2022年邮政行业寄递业务量完成1391亿件,同比增长2。7;业务收入1。35万……有人跑了!足球解说员爆料后多次修改,疑似对方级别太高不能明说有人已经跑路了!在陈戌源被抓后没多久又有人爆出猛料,但是这条爆料发出后也是进行了二次修改,疑似不能说的太多,不然就会惹火上身。我们都认为陈戌源是足坛里最大的鱼,只要把他抓了就行……美团进军香港,为何两地骑手工资差异巨大?随着美团外卖的兴起,越来越多的人开始使用它来解决日常饮食问题。但是最近有消息称,这款应用程序在内地和香港之间存在很大差异。近年来内地市场的发展快,美团也开始进军香港。美团……江苏南京发现一个万米长城,和八达岭长城长得很像,游客却很少!天南地北大拜年提到长城,可能大部分朋友都会想到北京八达岭长城。北京八达岭长城既是中国古代伟大的防御工程万里长城的重要组成部分,也是明长城的一个隘口。八达岭长城为居庸关的重……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网