手把手教你實(shí)現(xiàn)顯示IP歸屬地

手把手教你實(shí)現(xiàn)顯示IP歸屬地


近年來(lái),根據(jù)《國(guó)家互聯(lián)網(wǎng)用戶賬號(hào)名稱信息管理規(guī)定》要求互聯(lián)網(wǎng)用戶賬號(hào)服務(wù)平臺(tái)標(biāo)注IP地址屬地信息,微信公眾號(hào)、抖音、知乎各大平臺(tái)紛紛都上線了IP歸屬地的功能。本文就帶大家實(shí)現(xiàn)該功能,國(guó)內(nèi)的用戶精確到省份,國(guó)外用戶精確到國(guó)家。

實(shí)現(xiàn)原理

那么如何根據(jù)IP地址查找到詳細(xì)的歸屬地信息呢?

答案是:通過(guò) 自治系統(tǒng)(Autonomous System)。

互聯(lián)網(wǎng)是由不同網(wǎng)絡(luò)組成的網(wǎng)絡(luò),自治系統(tǒng)是組成 Internet 的大型網(wǎng)絡(luò),連接到 Internet 的每臺(tái)計(jì)算機(jī)或設(shè)備都連接到一個(gè) AS。而每一個(gè)自治系統(tǒng)都會(huì)有一個(gè)編碼,我們稱之為 ASN。

可以認(rèn)為 AS 類似于一個(gè)城鎮(zhèn)的郵局。

郵件從一個(gè)郵局到另一個(gè)郵局,直到到達(dá)正確的城鎮(zhèn)為止,然后該城鎮(zhèn)的郵局將在該城鎮(zhèn)內(nèi)傳遞郵件。每個(gè) AS 都控制一組特定的 IP 地址,就像每個(gè)鎮(zhèn)的郵局負(fù)責(zé)將郵件傳遞到該鎮(zhèn)內(nèi)的所有地址一樣。

通常,每個(gè) AS 由單個(gè)大型組織(例如 Internet 服務(wù)提供商(ISP)、大型企業(yè)技術(shù)公司、大學(xué)或政府機(jī)構(gòu))運(yùn)營(yíng)。

到這里,我們可以捋清楚這樣一個(gè)邏輯關(guān)系:IP地址 -> 地址塊 -> 自治網(wǎng)絡(luò)編碼(ASN) -> 組織 -> 國(guó)家。

通過(guò) IP 地址,我們就可以定位到一個(gè)大致的地理位置,例如:北京朝陽(yáng)區(qū)、深圳南山區(qū)等。例如我現(xiàn)在的 IP 地址就歸屬于編碼為 AS4xxx 這個(gè)自治網(wǎng)絡(luò),通過(guò)這個(gè) ASN 可以知道位置在中國(guó)深圳,這個(gè) ASN 編碼所屬的組織為 中國(guó)電信。

但是,要實(shí)現(xiàn)這樣一個(gè)查找功能,首先得要有一個(gè)IP地址歸屬地?cái)?shù)據(jù)庫(kù)。網(wǎng)上找了下,以前淘寶網(wǎng)有一個(gè)開(kāi)源的接口API開(kāi)源調(diào)用,但不知道為何,近一兩年,該接口地址已經(jīng)下線不能使用了。我們可以通過(guò)調(diào)用[昂焱數(shù)據(jù)](https://www.ayshuju.com/)平臺(tái)提供的IP地址歸屬地接口來(lái)實(shí)現(xiàn)此功能。

IP地址歸屬地查詢主要針對(duì)當(dāng)前實(shí)際運(yùn)用最多的IPv4地址,根據(jù)IP地址查詢其歸屬地。IP地址歸屬地查詢適用于網(wǎng)絡(luò)定位、網(wǎng)絡(luò)跟蹤、網(wǎng)絡(luò)排查等相關(guān)場(chǎng)景。

獲取IP地址

首先,需要獲取客戶端IP地址

獲取IP地址方法:

/**

* 獲取IP地址

*

* 使用Nginx等反向代理軟件, 則不能通過(guò)request.getRemoteAddr()獲取IP地址

* 如果使用了多級(jí)反向代理的話,X-Forwarded-For的值并不止一個(gè),而是一串IP地址,X-Forwarded-For中第一個(gè)非unknown的有效IP字符串,則為真實(shí)IP地址

*/

public static String getIpAddr(HttpServletRequest request) {

? ? String ip = null;

? ? ? ? try {

? ? ? ? ? ? ip = request.getHeader("x-forwarded-for");

? ? ? ? ? ? if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {

? ? ? ? ? ? ? ? ip = request.getHeader("Proxy-Client-IP");

? ? ? ? ? ? }

? ? ? ? ? ? if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

? ? ? ? ? ? ? ? ip = request.getHeader("WL-Proxy-Client-IP");

? ? ? ? ? ? }

? ? ? ? ? ? if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {

? ? ? ? ? ? ? ? ip = request.getHeader("HTTP_CLIENT_IP");

? ? ? ? ? ? }

? ? ? ? ? ? if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {

? ? ? ? ? ? ? ? ip = request.getHeader("HTTP_X_FORWARDED_FOR");

? ? ? ? ? ? }

? ? ? ? ? ? if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {

? ? ? ? ? ? ? ? ip = request.getRemoteAddr();

? ? ? ? ? ? }

? ? ? ? } catch (Exception e) {

? ? ? ? logger.error("IPUtils ERROR ", e);

? ? ? ? }


? ? ? ? return ip;

? ? }

調(diào)用IP歸屬地接口:

public class Test{

? ? // 請(qǐng)求的昂焱數(shù)據(jù)IP歸屬地接口地址

? ? public static final String URL = "https://www.xxxx.com/data/ip/address";

? ? // 請(qǐng)求的密鑰

? ? public static final String APPKEY = "請(qǐng)求的密鑰";

? ? // 請(qǐng)求客戶端

? ? public static OkHttpClient client = new OkHttpClient();

? ? public static void main(String[] args) throws IOException {

? ? ? ? RequestBody formBody = new FormBody.Builder()

? ? ? ? ? ? ? ? .add("appKey", APPKEY)

? ? ? ? ? ? ? ? .add("ip", "117.186.0.233")

? ? ? ? ? ? ? ? .build();

? ? ? ? // 執(zhí)行post請(qǐng)求

? ? ? ? String result = doPostByFormData(URL, formBody);

? ? ? ? System.out.println(result);

? ? }

? ? /**

? ? * @param url url

? ? * @throws IOException

? ? */

? ? public static String doPostByFormData(String url, RequestBody body) throws IOException {

? ? ? ? Request request = new Request.Builder().url(url).post(body).build();

? ? ? ? try (Response response = client.newCall(request).execute()) {

? ? ? ? ? ? return response.body().string();

? ? ? ? }

? ? }

}

```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容