




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Java獲取用戶IP屬地模擬抖音詳解目錄介紹內(nèi)置的三種查詢算法ip2region安裝
介紹
細(xì)心的小伙伴可能會(huì)發(fā)現(xiàn),抖音新上線了IP屬地的功能,小伙伴在發(fā)表動(dòng)態(tài)、發(fā)表評論以及聊天的時(shí)候,都會(huì)顯示自己的IP屬地信息
下面,我就來講講,Java中是如何獲取IP屬地的,主要分為以下幾步
通過HttpServletRequest對象,獲取用戶的IP地址通過IP地址,獲取對應(yīng)的省份、城市
首先需要寫一個(gè)IP獲取的工具類,因?yàn)槊恳淮斡脩舻腞equest請求,都會(huì)攜帶上請求的IP地址放到請求頭中。
publicclassIpUtil{
publicstaticStringgetIpAddr(ServerHttpRequestrequest){
HttpHeadersheaders=request.getHeaders();
StringipAddress=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("")||ipAddress.equals("0:0:0:0:0:0:0:1")){
//根據(jù)網(wǎng)卡取本機(jī)配置的IP
try{
InetAddressinet=InetAddress.getLocalHost();
ipAddress=inet.getHostAddress();
}catch(UnknownHostExceptione){
log.error("根據(jù)網(wǎng)卡獲取本機(jī)配置的IP異常",e);
//對于通過多個(gè)代理的情況,第一個(gè)IP為客戶端真實(shí)IP,多個(gè)IP按照','分割
if(ipAddress!=nullipAddress.indexOf(",")0){
ipAddress=ipAddress.split(",")[0];
returnipAddress;
}
這里有三個(gè)名詞,分別是
X-Forwarded-For:一個(gè)HTTP擴(kuò)展頭部,主要是為了讓W(xué)eb服務(wù)器獲取訪問用戶的真實(shí)IP地址。每個(gè)IP地址,每個(gè)值通過逗號+空格分開,最左邊是最原始客戶端的IP地址,中間如果有多層代理,每?層代理會(huì)將連接它的客戶端IP追加在X-Forwarded-For右邊。X-Real-IP:一般只記錄真實(shí)發(fā)出請求的客戶端IPProxy-Client-IP:這個(gè)一般是經(jīng)過Apachehttp服務(wù)器的請求才會(huì)有,用Apachehttp做代理時(shí)一般會(huì)加上Proxy-Client-IP請求頭WL-Proxy-Client-IP:也是通過Apachehttp服務(wù)器,在weblogic插件加上的頭。
在我們獲取到用戶的IP地址后,那么就可以獲取對應(yīng)的ip信息了
我在Github沖浪的時(shí)候,發(fā)現(xiàn)了Ip2region項(xiàng)目。
一個(gè)準(zhǔn)確率99.9%的離線IP地址定位庫,0.0x毫秒級查詢,ip2region.db數(shù)據(jù)庫只有數(shù)MB,提供了java,php,c,python,nodejs,golang,c#等查詢綁定和Binary,B樹,內(nèi)存三種查詢算法。
數(shù)據(jù)聚合了一些知名ip到地名查詢提供商的數(shù)據(jù),這些是他們官方的的準(zhǔn)確率,經(jīng)測試著實(shí)比經(jīng)典的純真IP定位準(zhǔn)確一些。ip2region的數(shù)據(jù)聚合自以下服務(wù)商的開放API或者數(shù)據(jù)。
80%,淘寶IP地址庫,/10%,GeoIP,/2%,純真IP庫,/
備注:如果上述開放API或者數(shù)據(jù)都不給開放數(shù)據(jù)時(shí)ip2region將停止數(shù)據(jù)的更新服務(wù)。
每條ip數(shù)據(jù)段都固定了格式:
_城市Id|國家|區(qū)域|省份|城市|ISP_
只有中國的數(shù)據(jù)精確到了城市,其他國家有部分?jǐn)?shù)據(jù)只能定位到國家,后前的選項(xiàng)全部是0,已經(jīng)包含了全部你能查到的大大小小的國家
生成的數(shù)據(jù)庫文件ip2region.db只有幾MB,最小的版本只有1.5MB,隨著數(shù)據(jù)的詳細(xì)度增加數(shù)據(jù)庫的大小也慢慢增大,目前還沒超過8MB。
內(nèi)置的三種查詢算法
全部的查詢客戶端單次查詢都在0.x毫秒級別,內(nèi)置了三種查詢算法
memory算法:整個(gè)數(shù)據(jù)庫全部載入內(nèi)存,單次查詢都在0.1x毫秒內(nèi),C語言的客戶端單次查詢在0.00x毫秒級別。binary算法:基于二分查找,基于ip2region.db文件,不需要載入內(nèi)存,單次查詢在0.x毫秒級別。b-tree算法:基于btree算法,基于ip2region.db文件,不需要載入內(nèi)存,單詞查詢在0.x毫秒級別,比binary算法更快。
ip2region安裝
下面,就讓我們給項(xiàng)目引入ip2region,進(jìn)行ip信息轉(zhuǎn)換吧
首先引入maven依賴
dependency
groupIdorg.lionsoul/groupId
artifactIdip2region/artifactId
version1.7.2/version
/dependency
然后編寫一個(gè)工具類IpUtils,首先需要加載ip2region.db文件
static{
dbPath=createFtlFileByFtlArray()+"ip2region.db";
try{
config=newDbConfig();
}catch(DbMakerConfigExceptione){
e.printStackTrace();
try{
searcher=newDbSearcher(config,dbPath);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}
在加載的時(shí)候,需要下載倉庫中的ip2region.db文件,然后放到resource目錄下
然后,通過內(nèi)置的三種算法,分別轉(zhuǎn)換用戶ip地址
publicstaticStringgetCityInfo(Stringip){
if(StringUtils.isEmpty(dbPath)){
log.error("Error:Invalidip2region.dbfile");
returnnull;
if(config==null||searcher==null){
log.error("Error:DbSearcherorDbConfigisnull");
returnnull;
//查詢算法
//B-tree,B樹搜索(更快)
intalgorithm=DbSearcher.BTREE_ALGORITHM;
//Binary,使用二分搜索
//DbSearcher.BINARY_ALGORITHM
//Memory,加載內(nèi)存(最快)
//DbSearcher.MEMORY_ALGORITYM
try{
//使用靜態(tài)代碼塊,減少文件讀取操作
//DbConfigconfig=newDbConfig();
//DbSearchersearcher=newDbSearcher(config,dbPath);
//definethemethod
Methodmethod=null;
switch(algorithm){
caseDbSearcher.BTREE_ALGORITHM:
method=searcher.getClass().getMethod("btreeSearch",String.class);
break;
caseDbSearcher.BINARY_ALGORITHM:
method=searcher.getClass().getMethod("binarySearch",String.class);
break;
caseDbSearcher.MEMORY_ALGORITYM:
method=searcher.getClass().getMethod("memorySearch",String.class);
break;
default:
DataBlockdataBlock=null;
if(Util.isIpAddress(ip)==false){
System.out.println("Error:Invalidipaddress");
dataBlock=(DataBlock)method.invoke(searcher,ip);
StringipInfo=dataBlock.getRegion();
if(!StringUtils.isEmpty(ipInfo)){
ipInfo=ipInfo.replace("|0","");
ipInfo=ipInfo.replace("0|","");
returnipInfo;
}catch(Exceptione){
e.printStackTrace();
returnnull;
}
下面,我們編寫main函數(shù)進(jìn)行測試,發(fā)現(xiàn)可以正常的解析出ip信息
由于ip屬地在國內(nèi)的話,只會(huì)展示省份,而國外的話,只會(huì)展示國家。所以我們還需要對這個(gè)方法進(jìn)行一下封裝,得到獲取IP屬地的信息。
/**
*獲取IP屬地
*@paramip
*@return
publicstaticStringgetIpPossession(Stringip){
StringcityInfo=getCityInfo(ip);
if(!StringUtils.isEmpty(cityInfo)){
cityInfo=cityInfo.replace("|","");
String[]cityList=cityInfo.split("");
if(cityList.length0){
//國內(nèi)的顯示到具體的省
if("中國".equals(cityList[0])){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年動(dòng)漫產(chǎn)業(yè)鏈協(xié)同創(chuàng)新與產(chǎn)業(yè)品牌建設(shè)策略報(bào)告
- 黔南州安全員c證考試試題及答案
- 遼寧低壓電工證考試試題及答案
- 【成都】2025年上半年成都市城市管理委員會(huì)所屬事業(yè)單位招聘工作人員17人筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 建筑上海安全員c證考試試題及答案
- 檢驗(yàn)科三基三嚴(yán)考試試題及答案
- 2016陜西中考數(shù)學(xué)試題及答案
- 電力設(shè)施建設(shè)臨時(shí)占地補(bǔ)償協(xié)議
- 休閑農(nóng)業(yè)園區(qū)場地租賃與休閑觀光服務(wù)合同
- 車輛無償租賃給旅游觀光企業(yè)使用服務(wù)協(xié)議
- 工業(yè)污水處理廠項(xiàng)目經(jīng)濟(jì)效益和社會(huì)效益分析報(bào)告
- TCALC 003-2023 手術(shù)室患者人文關(guān)懷管理規(guī)范
- 臭氧發(fā)生器安全操作規(guī)程及維護(hù)保養(yǎng)
- 第16課《看病用藥有學(xué)問》 課件
- 新上煉油廠商業(yè)計(jì)劃書
- 航攝應(yīng)急預(yù)案
- 技能認(rèn)證支部書記考試(習(xí)題卷1)
- 食堂燃?xì)庑孤?yīng)急演練預(yù)案
- 結(jié)合材料請理論聯(lián)系實(shí)際分析為什么說理想信念是精神之“鈣”參考答案二
- 客房服務(wù)員國家標(biāo)準(zhǔn)
- 商業(yè)模式畫布模板
評論
0/150
提交評論