国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java根據(jù)IP地址獲取對應(yīng)歸屬地

這篇具有很好參考價值的文章主要介紹了Java根據(jù)IP地址獲取對應(yīng)歸屬地。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1 前言

最近,各大平臺都新增了評論區(qū)顯示發(fā)言者ip歸屬地的功能,例如嗶哩嗶哩,微博,知乎等等,下面,就來講講,Java 中是如何獲取 IP 屬地的

2 獲取IP地址

在Java中有多種獲取IP地址的方式,就不一一介紹了,給出了一個最常用的IP地址獲取方式,僅供參考,代碼如下:

@Slf4j
public class IpUtils {

    /**
     * 獲取ip地址
     * @param request request對象
     * @return 返回對應(yīng)IP地址
     */
    public static String getIpAddress(HttpServletRequest request){
        String ipAddress = null;
        try {
            ipAddress = request.getHeader("X-Forwarded-For");
            if (ipAddress != null && ipAddress.length() != 0 && !"unknown".equalsIgnoreCase(ipAddress)) {
                // 多次反向代理后會有多個ip值,第一個ip才是真實ip
                if (ipAddress.contains(",")) {
                    ipAddress = ipAddress.split(",")[0];
                }
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("HTTP_CLIENT_IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
            }
        }catch (Exception e) {
            log.error("IPUtils ERROR ",e);
        }
        return ipAddress;
    }
    
    /**
     * 獲取mac地址
     */
    public static String getMacAddress() throws Exception {
        // 取mac地址
        byte[] macAddressBytes = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getHardwareAddress();
        // 下面代碼是把mac地址拼裝成String
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < macAddressBytes.length; i++) {
            if (i != 0) {
                sb.append("-");
            }
            // mac[i] & 0xFF 是為了把byte轉(zhuǎn)化為正整數(shù)
            String s = Integer.toHexString(macAddressBytes[i] & 0xFF);
            sb.append(s.length() == 1 ? 0 + s : s);
        }
        return sb.toString().trim().toUpperCase();
    }
    
}

對這里出現(xiàn)的幾個名詞解釋一下:

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

3 Ip2region介紹

3.1 99.9% 準(zhǔn)確率

數(shù)據(jù)聚合了一些知名 ip 到地名查詢提供商的數(shù)據(jù),這些是他們官方的的準(zhǔn)確率,經(jīng)測試著實比經(jīng)典的純真 IP 定位準(zhǔn)確一些。

ip2region 的數(shù)據(jù)聚合自以下服務(wù)商的開放 API 或者數(shù)據(jù)(升級程序每秒請求次數(shù) 2 到 4 次):

  • 01,>80%,淘寶IP地址庫,http://ip.taobao.com/%5C
  • 02,≈10%,GeoIP,https://geoip.com/%5C
  • 03,≈2%,純真 IP 庫,http://www.cz88.net/%5C

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

3.2 多查詢客戶端的支持

已經(jīng)集成的客戶端有:java、C#、php、c、python、nodejs、php擴展(php5 和 php7)、golang、rust、lua、lua_c,nginx。
Java根據(jù)IP地址獲取對應(yīng)歸屬地

3.3 Ip2region V2.0 特性

3.3.1 標(biāo)準(zhǔn)化的數(shù)據(jù)格式

每個 ip 數(shù)據(jù)段的 region 信息都固定了格式:國家|區(qū)域|省份|城市|ISP,只有中國的數(shù)據(jù)絕大部分精確到了城市,其他國家部分數(shù)據(jù)只能定位到國家,后前的選項全部是 0。

3.3.2 數(shù)據(jù)去重和壓縮

xdb 格式生成程序會自動去重和壓縮部分數(shù)據(jù),默認的全部 IP 數(shù)據(jù),生成的 ip2region.xdb 數(shù)據(jù)庫是 11MiB,隨著數(shù)據(jù)的詳細度增加數(shù)據(jù)庫的大小也慢慢增大。

3.3.3 極速查詢響應(yīng)

即使是完全基于 xdb 文件的查詢,單次查詢響應(yīng)時間在十微秒級別。

可通過如下兩種方式開啟內(nèi)存加速查詢:

  • vIndex 索引緩存:使用固定的 512KiB 的內(nèi)存空間緩存 vector index 數(shù)據(jù),減少一次 IO
    磁盤操作,保持平均查詢效率穩(wěn)定在 10-20 微秒之間。
  • xdb 整個文件緩存:將整個 xdb 文件全部加載到內(nèi)存,內(nèi)存占用等同于 xdb 文件大小,無磁盤 IO 操作,保持微秒級別的查詢效率。

3.3.4 極速查詢響應(yīng)

v2.0 格式的 xdb 支持億級別的 IP 數(shù)據(jù)段行數(shù),region 信息也可以完全自定義,例如:你可以在 region 中追加特定業(yè)務(wù)需求的數(shù)據(jù),例如:GPS信息/國際統(tǒng)一地域信息編碼/郵編等。也就是你完全可以使用 ip2region 來管理你自己的 IP 定位數(shù)據(jù)。

4 獲取ip2region.xdb文件

為什么要獲取ip2region.xdb文件呢?是因為獲取ip屬地是以這個文件為基礎(chǔ)的

4.1 直接獲取

文件我已經(jīng)打包到百度網(wǎng)盤了,小伙伴們可以直接下載,地址如下:
鏈接:https://pan.baidu.com/s/1JSB0z2Cwl4umujKUzpBhFA
提取碼:0zz5

4.2 自行打包

下載項目:
鏈接:https://pan.baidu.com/s/1wHjUoHCmyH_PVcB9nf3cLw
提取碼:aq5y
進入到target文件夾,執(zhí)行命令:

java -jar ip2region-maker-1.0.0.jar --src=./ip.merge.txt --dst=./ip2region.xdb

5 使用Ip2region V2.0通過 IP 地址,獲取對應(yīng)的省份、城市

5.1 內(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算法更快。

5.2 具體實現(xiàn)方法

5.2.1 引入ip2region依賴

<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>2.6.4</version>
</dependency>

5.2.2 ip2region.xdb 文件,放到工程resources目錄下

Java根據(jù)IP地址獲取對應(yīng)歸屬地

5.2.3 完全基于ip2region.xdb文件,對用戶ip地址進行轉(zhuǎn)換

    /**
     * 獲取ip屬地(文件掃描)
     * @param ip IP地址
     * @return 返回地址
     */
    public static String getCityInfoByFile(String ip) {
        // 1、創(chuàng)建 searcher 對象
        String dbPath = "D:\\gitProject\\workRecord\\src\\main\\resources\\ip\\ip2region.xdb";
        Searcher searcher;
        try {
            searcher = Searcher.newWithFileOnly(dbPath);
        } catch (IOException e) {
            log.error("failed to create searcher with `{}`: ", dbPath, e);
            return null;
        }

        // 2、查詢
        try {
            long sTime = System.nanoTime();
            String region = searcher.search(ip);
            long cost = TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - sTime);
            log.info("{region: {}, ioCount: {}, took: {} μs}", region, searcher.getIOCount(), cost);
            return region;
        } catch (Exception e) {
            log.info("failed to search({}): ", ip, e);
        }
        return null;
		// 3、備注:并發(fā)使用,每個線程需要創(chuàng)建一個獨立的 searcher 對象單獨使用。
    }

    public static void main(String[] args) throws Exception {
        getCityInfoByFile("111.0.72.130");
    }

輸出:
Java根據(jù)IP地址獲取對應(yīng)歸屬地

5.2.4 緩存 VectorIndex 索引,對用戶ip地址進行轉(zhuǎn)換

我們可以提前從 xdb 文件中加載出來 VectorIndex 數(shù)據(jù),然后全局緩存,每次創(chuàng)建Searcher 對象的時候使用全局的 VectorIndex 緩存可以減少一次固定的 IO 操作,從而加速查詢,減少 IO 壓力。

    /**
     * 獲取ip屬地(緩存 VectorIndex 索引)
     * @param ip IP地址
     * @return 返回地址
     */
    public static String getCityInfoByVectorIndex(String ip) {
        String dbPath = "D:\\gitProject\\workRecord\\src\\main\\resources\\ip\\ip2region.xdb";
        // 1、從 dbPath 中預(yù)先加載 VectorIndex 緩存,并且把這個得到的數(shù)據(jù)作為全局變量,后續(xù)反復(fù)使用。
        byte[] vIndex;
        try {
            vIndex = Searcher.loadVectorIndexFromFile(dbPath);
        } catch (Exception e) {
            log.error("failed to load vector index from `{}`: ", dbPath, e);
            return null;
        }

        // 2、使用全局的 vIndex 創(chuàng)建帶 VectorIndex 緩存的查詢對象。
        Searcher searcher;
        try {
            searcher = Searcher.newWithVectorIndex(dbPath, vIndex);
        } catch (Exception e) {
            log.error("failed to create vectorIndex cached searcher with `{}`: ", dbPath, e);
            return null;
        }

        // 3、查詢
        try {
            long sTime = System.nanoTime();
            String region = searcher.search(ip);
            long cost = TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - sTime);
            log.info("{region: {}, ioCount: {}, took: {} μs}\n", region, searcher.getIOCount(), cost);
            return region;
        } catch (Exception e) {
            log.error("failed to search({}): ", ip, e);
        }
        return null;
		// 備注:每個線程需要單獨創(chuàng)建一個獨立的 Searcher 對象,但是都共享全局的制度 vIndex 緩存。
    }

    public static void main(String[] args) throws Exception {
        getCityInfoByVectorIndex("111.0.72.130");
    }

輸出:
Java根據(jù)IP地址獲取對應(yīng)歸屬地

5.2.5 緩存整個 xdb 數(shù)據(jù),對用戶ip地址進行轉(zhuǎn)換

我們也可以預(yù)先加載整個 ip2region.xdb 的數(shù)據(jù)到內(nèi)存,然后基于這個數(shù)據(jù)創(chuàng)建查詢對象來實現(xiàn)完全基于文件的查詢,類似之前的 memory search。

    /**
     * 獲取ip屬地(緩存整個 xdb 數(shù)據(jù))
     * @param ip IP地址
     * @return 返回地址
     */
    public static String getCityInfoByMemorySearch(String ip) {
        String dbPath = "D:\\gitProject\\workRecord\\src\\main\\resources\\ip\\ip2region.xdb";

        // 1、從 dbPath 加載整個 xdb 到內(nèi)存。
        byte[] cBuff;
        try {
            cBuff = Searcher.loadContentFromFile(dbPath);
        } catch (Exception e) {
            log.error("failed to load content from `{}`: ", dbPath, e);
            return null;
        }

        // 2、使用上述的 cBuff 創(chuàng)建一個完全基于內(nèi)存的查詢對象。
        Searcher searcher;
        try {
            searcher = Searcher.newWithBuffer(cBuff);
        } catch (Exception e) {
            log.error("failed to create content cached searcher: ", e);
            return null;
        }

        // 3、查詢
        try {
            long sTime = System.nanoTime();
            String region = searcher.search(ip);
            long cost = TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - sTime);
            log.info("{region: {}, ioCount: {}, took: {} μs}\n", region, searcher.getIOCount(), cost);
        } catch (Exception e) {
            log.error("failed to search({}): ", ip, e);
        }
        return null;
        // 備注:并發(fā)使用,用整個 xdb 數(shù)據(jù)緩存創(chuàng)建的查詢對象可以安全的用于并發(fā),也就是你可以把這個 searcher 對象做成全局對象去跨線程訪問。
    }

    public static void main(String[] args) throws Exception {
        getCityInfoByMemorySearch("111.0.72.130");
    }

輸出:
Java根據(jù)IP地址獲取對應(yīng)歸屬地

6 總結(jié)

根據(jù)IP地址獲取對應(yīng)歸屬地的介紹就到這了,有問題的小伙伴們可以在評論區(qū)討論文章來源地址http://www.zghlxwxcb.cn/news/detail-423526.html

到了這里,關(guān)于Java根據(jù)IP地址獲取對應(yīng)歸屬地的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java獲取IP及歸屬地

    Java獲取IP及歸屬地

    最近我們發(fā)現(xiàn)各大社交平臺都出現(xiàn)了一個新的功能:IP屬地。 比如某乎: 這個IP屬地是怎么做到的呢?今天我來教教你,保證你看完直呼Easy~ 1.Java網(wǎng)絡(luò)編程 2.Servlet 通過運行這個方法,可以看到,控制臺打印了IP和城市信息,也就是我們想要的 IP屬地信息 啦! 在你的項目里,

    2024年02月11日
    瀏覽(101)
  • 通過 Request 請求獲取真實 IP 地址以及對應(yīng)省份城市

    通過 Request 請求獲取真實 IP 地址以及對應(yīng)省份城市

    title: 通過 Request 請求獲取真實 IP 地址以及對應(yīng)省份城市和系統(tǒng)瀏覽器信息 date: 2022-12-16 16:20:26 tags: GeoIP2 UserAgentUtils categories: 開發(fā)實踐 cover: https://cover.png feature: false 代碼如下,這里的 CommonUtil.isBlank() 為封裝的判空方法 1、首先,獲取 X-Forwarded-For 中第 0 位的 IP 地址,它在

    2024年02月01日
    瀏覽(29)
  • qt-c++進階1-window、linux下獲取本機所有網(wǎng)卡ip信息、根據(jù)網(wǎng)卡名獲取ip地址。

    qt-c++進階1-window、linux下獲取本機所有網(wǎng)卡ip信息、根據(jù)網(wǎng)卡名獲取ip地址。

    例如:第一章 主要是通過qt-c++實現(xiàn)獲取本機電腦的網(wǎng)卡信息或者是IP信息 總結(jié)c++獲取本機網(wǎng)卡信息的方法 第一章:適用于windows操作系統(tǒng)、linux操作系統(tǒng) 用 QHostAddress 解析獲取本機 IPV4地址 ; 用 QNetworkInterface 解析獲取所有網(wǎng)關(guān)信息( IP地址(IPV4和IPV6) 、 子網(wǎng)掩碼 、 廣播地

    2024年02月13日
    瀏覽(24)
  • Node.js、Express框架之獲取客戶端IP地址,并獲取IP對應(yīng)的城市名「簡單好用,收藏不虧」

    在進入正題之前,我們先來了解一下IP地址對我們開發(fā)者來說都有哪些重要的作用: IP地址是我們用來記錄用戶訪問日志的一個重要標(biāo)識。 一方面,我們可以用來防止某一個IP地址帶來的大量DDOS攻擊,通過判斷IP地址來阻止此IP繼續(xù)訪問攻擊; 另外一個用途是用來定位,通過

    2024年02月17日
    瀏覽(37)
  • Java 根據(jù)網(wǎng)絡(luò)地址URL獲取文件

    系統(tǒng)需要根據(jù)提供的文件地址URL獲取該文件,代碼實現(xiàn)如下:

    2024年02月11日
    瀏覽(22)
  • IP獲取歸屬地區(qū)(免費)

    使用 http://whois.pconline.com.cn/ipJson.jsp 這個 URL 來獲取 IP 地址的歸屬城市信息

    2024年02月16日
    瀏覽(28)
  • java根據(jù)音頻流或者音頻的地址獲取分貝的工具類

    工具類 測試類

    2024年02月06日
    瀏覽(22)
  • Java調(diào)用高德地圖API根據(jù)詳細地址獲取經(jīng)緯度

    Java調(diào)用高德地圖API根據(jù)詳細地址獲取經(jīng)緯度

    訪問高德開放平臺https://lbs.amap.com/ 登錄后,在控制臺中創(chuàng)建一個應(yīng)用,獲取生成的應(yīng)用key。這個key將用于訪問高德地圖API。 ? 您可以使用Java中的 HttpURLConnection 或 HttpClient 等工具發(fā)送HTTP請求到高德地圖API,并傳遞參數(shù)以獲取經(jīng)緯度信息。以下是一個使用 HttpURLConnection 的示例

    2024年02月05日
    瀏覽(161)
  • 使用 ip2region 獲取用戶的 IP 歸屬地

    使用 ip2region 獲取用戶的 IP 歸屬地

    ip2region 是一個離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,能實現(xiàn)10微秒級別的查詢效率,提供了眾多主流編程語言的xdb數(shù)據(jù)生成和查詢客戶端實現(xiàn)。 每個 ip 數(shù)據(jù)段的 region 信息都固定了格式: 國家|區(qū)域|省份|城市|ISP ,只有中國的數(shù)據(jù)絕大部分精確到了城市,其他國家部分數(shù)

    2024年02月13日
    瀏覽(17)
  • (Java版)根據(jù)ip獲取地理位置以及相關(guān)信息

    (Java版)根據(jù)ip獲取地理位置以及相關(guān)信息

    1.首先我們需要進入地圖開放平臺的官網(wǎng),根據(jù)提示注冊賬號,以百度地圖為例: https://lbsyun.baidu.com/ 我們新用戶登錄之后會彈出這個頁面,選擇個人愛好者進入完成注冊 成功之后我們會進入到下面這個頁面,如果沒有申請ak的小伙伴在控制臺看板這一塊是有一個流程指引的

    2024年02月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包