Java獲取用戶IP屬地模擬抖音詳解_第1頁
Java獲取用戶IP屬地模擬抖音詳解_第2頁
Java獲取用戶IP屬地模擬抖音詳解_第3頁
Java獲取用戶IP屬地模擬抖音詳解_第4頁
Java獲取用戶IP屬地模擬抖音詳解_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第Java獲取用戶IP屬地模擬抖音詳解目錄介紹內(nèi)置的三種查詢算法ip2region安裝

介紹

細心的小伙伴可能會發(fā)現(xiàn),抖音新上線了IP屬地的功能,小伙伴在發(fā)表動態(tài)、發(fā)表評論以及聊天的時候,都會顯示自己的IP屬地信息

下面,我就來講講,Java中是如何獲取IP屬地的,主要分為以下幾步

通過HttpServletRequest對象,獲取用戶的IP地址通過IP地址,獲取對應的省份、城市

首先需要寫一個IP獲取的工具類,因為每一次用戶的Request請求,都會攜帶上請求的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)卡取本機配置的IP

try{

InetAddressinet=InetAddress.getLocalHost();

ipAddress=inet.getHostAddress();

}catch(UnknownHostExceptione){

log.error("根據(jù)網(wǎng)卡獲取本機配置的IP異常",e);

//對于通過多個代理的情況,第一個IP為客戶端真實IP,多個IP按照','分割

if(ipAddress!=nullipAddress.indexOf(",")0){

ipAddress=ipAddress.split(",")[0];

returnipAddress;

}

這里有三個名詞,分別是

X-Forwarded-For:一個HTTP擴展頭部,主要是為了讓Web服務器獲取訪問用戶的真實IP地址。每個IP地址,每個值通過逗號+空格分開,最左邊是最原始客戶端的IP地址,中間如果有多層代理,每?層代理會將連接它的客戶端IP追加在X-Forwarded-For右邊。X-Real-IP:一般只記錄真實發(fā)出請求的客戶端IPProxy-Client-IP:這個一般是經(jīng)過Apachehttp服務器的請求才會有,用Apachehttp做代理時一般會加上Proxy-Client-IP請求頭WL-Proxy-Client-IP:也是通過Apachehttp服務器,在weblogic插件加上的頭。

在我們獲取到用戶的IP地址后,那么就可以獲取對應的ip信息了

我在Github沖浪的時候,發(fā)現(xiàn)了Ip2region項目。

一個準確率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ù),這些是他們官方的的準確率,經(jīng)測試著實比經(jīng)典的純真IP定位準確一些。ip2region的數(shù)據(jù)聚合自以下服務商的開放API或者數(shù)據(jù)。

80%,淘寶IP地址庫,/10%,GeoIP,/2%,純真IP庫,/

備注:如果上述開放API或者數(shù)據(jù)都不給開放數(shù)據(jù)時ip2region將停止數(shù)據(jù)的更新服務。

每條ip數(shù)據(jù)段都固定了格式:

_城市Id|國家|區(qū)域|省份|城市|ISP_

只有中國的數(shù)據(jù)精確到了城市,其他國家有部分數(shù)據(jù)只能定位到國家,后前的選項全部是0,已經(jīng)包含了全部你能查到的大大小小的國家

生成的數(shù)據(jù)庫文件ip2region.db只有幾MB,最小的版本只有1.5MB,隨著數(shù)據(jù)的詳細度增加數(shù)據(jù)庫的大小也慢慢增大,目前還沒超過8MB。

內(nèi)置的三種查詢算法

全部的查詢客戶端單次查詢都在0.x毫秒級別,內(nèi)置了三種查詢算法

memory算法:整個數(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安裝

下面,就讓我們給項目引入ip2region,進行ip信息轉換吧

首先引入maven依賴

dependency

groupIdorg.lionsoul/groupId

artifactIdip2region/artifactId

version1.7.2/version

/dependency

然后編寫一個工具類IpUtils,首先需要加載ip2region.db文件

static{

dbPath=createFtlFileByFtlArray()+"ip2region.db";

try{

config=newDbConfig();

}catch(DbMakerConfigExceptione){

e.printStackTrace();

try{

searcher=newDbSearcher(config,dbPath);

}catch(FileNotFoundExceptione){

e.printStackTrace();

}

在加載的時候,需要下載倉庫中的ip2region.db文件,然后放到resource目錄下

然后,通過內(nèi)置的三種算法,分別轉換用戶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ù)進行測試,發(fā)現(xiàn)可以正常的解析出ip信息

由于ip屬地在國內(nèi)的話,只會展示省份,而國外的話,只會展示國家。所以我們還需要對這個方法進行一下封裝,得到獲取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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論