最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)通過(guò)IP獲取IP歸屬地的方法(離線+在線)

 更新時(shí)間:2023年10月17日 11:16:26   作者:拄杖盲學(xué)輕聲碼  
我們都知道安全攻擊都是在某臺(tái)客戶機(jī)上執(zhí)行某些惡意操作致使服務(wù)端響應(yīng)異常崩潰亦或響應(yīng)數(shù)據(jù)被篡改,首先我想到的是對(duì)訪問(wèn)的web端做一個(gè)IP的校驗(yàn),那么我們首先得知道客戶端的IP是多少,接下來(lái)此文重點(diǎn)介紹如何獲得,需要的朋友可以參考下

【寫(xiě)在前面】

編撰這篇文章還得從之前做安全業(yè)務(wù)需求說(shuō)起,我們都知道安全攻擊都是在某臺(tái)客戶機(jī)上執(zhí)行某些惡意操作(sql注入,DoS/DDoS攻擊),致使服務(wù)端響應(yīng)異常崩潰亦或響應(yīng)數(shù)據(jù)被篡改,那么怎么去阻止這些東西呢?

首先我想到的是對(duì)訪問(wèn)的web端做一個(gè)IP的校驗(yàn)(好比阿里云服務(wù)器的安全組設(shè)置),建立一些白名單,這樣能在很大程度上做到一個(gè)限制,其實(shí)在服務(wù)端也應(yīng)該要開(kāi)啟防火墻、設(shè)置權(quán)限等。那么我們首先得知道客戶端的IP是多少。接下來(lái)此文重點(diǎn)介紹如何獲取。

1、如何獲取客戶端訪問(wèn)IP

其實(shí)獲取IP是最簡(jiǎn)單的,因?yàn)橹灰姓?qǐng)求的話,都會(huì)存放在session里面的,只要通過(guò)下面這句話就可以拿到你所需要的IP,但是如何知道別人訪問(wèn)你的服務(wù)器呢,這個(gè)時(shí)候就需要您自己去寫(xiě)一個(gè)監(jiān)聽(tīng)事件listen;

獲取IP方式如下代碼即可:

HttpSession session = request.getSession(false);
if (session == null) {
    session = request.getSession();
    System.out.println("session:" + session + "創(chuàng)建成功");
    session.setAttribute("ip", request.getRemoteAddr());
    System.out.println("----訪問(wèn)的IP是:"+request.getRemoteAddr()+"----");
}

控制臺(tái)輸出:

在這里插入圖片描述

2、如何通過(guò)IP獲取歸屬地(離線+在線)

通過(guò)上面的方式拿到了IP地址,那么我想知道是哪些地方的人訪問(wèn)了我們的系統(tǒng)的話這就需要后臺(tái)去進(jìn)行查詢了,這才是這篇文章的核心:

2.1 離線模式

主要是通過(guò)自己本地的離線庫(kù)來(lái)實(shí)現(xiàn)查找的,有個(gè)弊端就是需要不斷的更新。

第一步:下載離線包ip2region.xdb

首先下載一個(gè)離線的IP歸屬映射包ip2region.xdb,沒(méi)有的可以去我的百度云盤(pán)上下載

下載地址如下:

鏈接:https://pan.baidu.com/s/1l_Gfhl0TVPYXvpK9QSiXyw

提取碼:hdd6

第二步:引入離線包

將我們的離線包放在resources目錄下,如下圖所示:

在這里插入圖片描述

Maven引入

打開(kāi)項(xiàng)目中的pom.xml文件,將下面的代碼復(fù)制到里面去(如果有則忽略):

<!-- ip2region  -->
    <dependency>
      <groupId>org.lionsoul</groupId>
      <artifactId>ip2region</artifactId>
      <version>2.6.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5</version>
    </dependency>

開(kāi)始引入時(shí)候可能會(huì)報(bào)紅,需要你自己去更新一下maven庫(kù)

在這里插入圖片描述

沒(méi)有報(bào)紅表示本地引入成功。

Pom.xml引入靜態(tài)打包(特別關(guān)鍵,不然會(huì)報(bào)錯(cuò))

[Xxx/ip2region.xdb] cannot be opened because it does not exist

<resource>
  <directory>src/main/resources</directory>
  <includes>
    <include>jdbc.properties</include>
    <include>*.xml</include>
    <include>ipdb/*.xdb</include>
  </includes>
</resource>

主要是在構(gòu)建的時(shí)候我們java會(huì)變成class文件進(jìn)行編譯,一些靜態(tài)資源需要自己手動(dòng)去加才能打到j(luò)ar包里面去。

第三步:代碼實(shí)現(xiàn)

控制臺(tái)效果如下所示(國(guó)內(nèi)國(guó)外的都有):

在這里插入圖片描述

核心實(shí)現(xiàn)代碼(記得要引入一些依賴包喲):

String dbPath = "/ipdb/ip2region.xdb";
try {
    InputStream inputStream = new ClassPathResource(dbPath).getInputStream();
    byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream);
    // 創(chuàng)建一個(gè)完全基于內(nèi)存的查詢對(duì)象
    searcher = Searcher.newWithBuffer(dbBinStr);
} catch (Exception e) {
    System.out.printf("failed to create content cached searcher: %s\n", e);
}
//把ip2r
String address = "";
try {
    address = searcher.search("66.249.79.193");
} catch (Exception e) {
    throw new RuntimeException(e);
}
System.out.println("=== 訪問(wèn)者的地址為:"+address+" === ");

到這里我們就只要維護(hù)好那個(gè)離線包文件就可以,定時(shí)更新一下。

2.2 在線模式

主要通過(guò)別人或者官網(wǎng)提供的API接口去實(shí)現(xiàn)查詢的功能,有個(gè)弊端就是特別依賴別人的服務(wù)器,萬(wàn)一別人服務(wù)器掛了就訪問(wèn)不了了。

具體實(shí)現(xiàn)效果和2.1離線模式介紹的一樣

在這里插入圖片描述

主要實(shí)現(xiàn)我封裝到一個(gè)java類(lèi)里面,寫(xiě)了一些特定的方法;

如下所示:

public static String getAddress(String ip) {
    try {
        URL realUrl = new URL("http://whois.pconline.com.cn/ipJson.jsp?ip=" + ip + "&json=true");
        HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
        conn.setRequestMethod("GET");
        conn.setUseCaches(false);
        conn.setReadTimeout(6000);
        conn.setConnectTimeout(6000);
        conn.setInstanceFollowRedirects(false);
        int code = conn.getResponseCode();
        StringBuilder sb = new StringBuilder();
        String ipaddr = "";
        if (code == 200) {
            InputStream in = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            ipaddr = ip + "=" + sb.substring(sb.indexOf("addr") + 7, sb.indexOf("regionNames") - 3);
        }
        return ipaddr;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

調(diào)用地方如下所示:

String address = IpAddressUtils.getAddress("66.249.79.193");
System.out.println("=== (在線)訪問(wèn)者的地址為:"+address+" === ");

3、推薦方式,先離線后在線

【重要】其實(shí)我們可以結(jié)合兩個(gè)使用一起,先采用離線,如果發(fā)現(xiàn)為null的話則調(diào)用在線查詢的方式。這樣在一定的程度上能夠保證數(shù)據(jù)的完整性,都有不足的話就互補(bǔ)一下;如下所示邏輯:

System.out.println("--- (在線+離線)訪問(wèn)者的IP為:66.249.79.193 --- ");
        //================離線模式獲取=start====================//
        String dbPath = "/ipdb/ip2region.xdb";
        try {
            InputStream inputStream = new ClassPathResource(dbPath).getInputStream();
            byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream);
            // 創(chuàng)建一個(gè)完全基于內(nèi)存的查詢對(duì)象
            searcher = Searcher.newWithBuffer(dbBinStr);
        } catch (Exception e) {
            System.out.printf("failed to create content cached searcher: %s\n", e);
        }
        //把ip2r
        String address = "";
        try {
            address = searcher.search("221.231.220.212");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
//        String address = IpAddressUtils.getCityInfo("66.249.79.193");
        System.out.println("=== (離線)訪問(wèn)者的地址為:"+address+" === ");
        //================離線模式獲取=end====================//
        //======================在線模式獲取 start========================//
        if("".equals(address)){
            address = IpAddressUtils.getAddress("66.249.79.193");
            System.out.println("=== (在線)訪問(wèn)者的地址為:"+address+" === ");
        }
        //======================在線模式獲取 end========================//

4、最后

以上就是Java實(shí)現(xiàn)通過(guò)IP獲取IP歸屬地的方法(離線+在線)的詳細(xì)內(nèi)容,更多關(guān)于Java獲取IP歸屬地的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot 配置 okhttp3的操作

    SpringBoot 配置 okhttp3的操作

    這篇文章主要介紹了SpringBoot 配置 okhttp3的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java super關(guān)鍵字知識(shí)點(diǎn)詳解

    java super關(guān)鍵字知識(shí)點(diǎn)詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java super關(guān)鍵字知識(shí)點(diǎn)詳解內(nèi)容,有興趣的朋友們可以參考下。
    2021-01-01
  • java如何將實(shí)體類(lèi)轉(zhuǎn)換成json并在控制臺(tái)輸出

    java如何將實(shí)體類(lèi)轉(zhuǎn)換成json并在控制臺(tái)輸出

    這篇文章主要介紹了java如何將實(shí)體類(lèi)轉(zhuǎn)換成json并在控制臺(tái)輸出問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java?MyBatis之Mapper代理詳解

    Java?MyBatis之Mapper代理詳解

    這篇文章主要介紹了Java?web中MyBatis的mapper代理,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2023-04-04
  • java設(shè)計(jì)日歷可視化的詳細(xì)步驟記錄

    java設(shè)計(jì)日歷可視化的詳細(xì)步驟記錄

    這篇文章主要給大家介紹了關(guān)于java設(shè)計(jì)日歷可視化的相關(guān)資料,通過(guò)自定義的CircleLabel類(lèi)來(lái)突出顯示今天的日期,并使用BorderLayout布局管理窗口組件,文章詳細(xì)描述了各個(gè)類(lèi)和方法的設(shè)計(jì)思想和實(shí)現(xiàn)邏輯,需要的朋友可以參考下
    2024-12-12
  • 詳解spring多線程與定時(shí)任務(wù)

    詳解spring多線程與定時(shí)任務(wù)

    本篇文章主要介紹了spring多線程與定時(shí)任務(wù),詳細(xì)的介紹了spring多線程任務(wù)和spring定時(shí)任務(wù),有興趣的可以了解一下。
    2017-04-04
  • 詳解Maven多模塊打包遇到的問(wèn)題解決方法

    詳解Maven多模塊打包遇到的問(wèn)題解決方法

    這篇文章主要介紹了詳解Maven多模塊打包遇到的問(wèn)題解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Springboot?集成spring?cache緩存的解決方案

    Springboot?集成spring?cache緩存的解決方案

    這篇文章主要介紹了Springboot?集成spring?cache緩存,使用緩存最關(guān)鍵的一點(diǎn)就是保證緩存與數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性,本文給大家介紹最常用的緩存操作模式,對(duì)Springboot?集成spring?cache緩存操作流程感興趣的朋友一起看看吧
    2022-06-06
  • 使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    這篇文章主要介紹了使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java選擇排序思路詳解

    Java選擇排序思路詳解

    這篇文章給大家介紹Java選擇排序思路詳解,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-12-12

最新評(píng)論

伊吾县| 新巴尔虎左旗| 科技| 韩城市| 阜平县| 玛曲县| 安乡县| 曲周县| 建水县| 大宁县| 武功县| 临沭县| 惠州市| 景德镇市| 手游| 西昌市| 镇巴县| 潞西市| 托克逊县| 孟村| 五家渠市| 邯郸县| 靖边县| 洪洞县| 鄂伦春自治旗| 巫溪县| 石门县| 扬州市| 保亭| 公安县| 昌图县| 个旧市| 金乡县| 清镇市| 射阳县| 万山特区| 同仁县| 嵊泗县| 叶城县| 阿城市| 城口县|