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

java如何根據(jù)用戶請求獲取ip地址并解析省市信息

 更新時間:2023年12月09日 09:41:59   作者:頗有幾分姿色  
根據(jù)當(dāng)前用戶本地IP地址,查詢IP地址庫,獲取IP所在的省市信息,目前有多種方式實現(xiàn)該功能,這篇文章主要給大家介紹了關(guān)于java如何根據(jù)用戶請求獲取ip地址并解析省市信息的相關(guān)資料,需要的朋友可以參考下

1.選型

1.1 實現(xiàn)方式

Java可以實現(xiàn)IP地址解析和省市區(qū)信息查詢,但是需要借助一些外部數(shù)據(jù)源或數(shù)據(jù)庫來實現(xiàn)。常用的方法有以下幾種:

1.1.1 本地文件解析

可以通過下載最新的IP地址段數(shù)據(jù)文件,然后在程序中解析該文件來獲取IP地址對應(yīng)的省市區(qū)等信息。不過這種方法需要手動維護(hù)IP庫文件,并且更新和查詢速度可能較慢,不適合高并發(fā)或大規(guī)模的應(yīng)用場景。

1.1.2 數(shù)據(jù)庫查詢

可以將IP地址段數(shù)據(jù)存儲在數(shù)據(jù)庫中,然后根據(jù)用戶請求的IP地址來查詢對應(yīng)的省市區(qū)等信息。常用的數(shù)據(jù)庫有MySQL、Oracle、SQL Server等。這種方法可以提高查詢效率和精度,并支持更靈活的查詢方式,但是需要考慮數(shù)據(jù)庫的設(shè)計和優(yōu)化問題。

1.1.3 第三方API代理

使用第三方IP查詢API代理來實現(xiàn)純Java的IP地址解析和省市區(qū)信息查詢。比如通過調(diào)用百度地圖API、高德地圖API等第三方服務(wù)來獲取IP地址對應(yīng)的位置信息。這種方法可以免去自行搭建IP數(shù)據(jù)庫的麻煩,同時也能保證查詢結(jié)果的準(zhǔn)確性和實時性,但需要考慮API使用頻率和費用等問題。

1.2 常用ip定位庫

1.2.1 Ip2region

Ip2region:Ip2region是一個基于Java的IP地址定位庫,提供了快速而準(zhǔn)確的IP查詢服務(wù)。它將全球IP地址劃分為多級區(qū)域,可以根據(jù)IP地址獲取對應(yīng)的省市區(qū)信息、運營商等詳細(xì)信息。

1.2.2 GeoLite2

GeoLite2:一款免費的IP地址庫,由MaxMind公司開發(fā)和維護(hù),提供高精度的IP地址定位服務(wù)??赏ㄟ^下載數(shù)據(jù)庫文件或使用API來查詢IP地址對應(yīng)的位置信息。

1.2.3 IP2Location

IP2Location:一款商業(yè)化的IP地址庫,提供全球范圍內(nèi)的IP地址定位服務(wù),支持IPv4/IPv6地址解析??赏ㄟ^訂閱服務(wù)或購買數(shù)據(jù)庫文件來使用。

1.2.4 ipapi

ipapi:一款云端IP地址查詢API,提供高效和準(zhǔn)確的IP地址定位服務(wù)。支持JSON/XML格式的返回數(shù)據(jù),可根據(jù)用戶需求選擇不同的套餐和服務(wù)計劃。

1.2.5 QQWry

QQWry:國內(nèi)最廣泛使用的IP地址庫之一,提供了IP地址到省市區(qū)縣、運營商等信息的映射。可通過下載最新版的dat文件或使用API來實現(xiàn)IP地址定位。

1.2.6 其他

國內(nèi)還有很多其他的定位庫,如淘寶、新浪、搜狐等ip庫,有興趣的朋友自己了解下。

1.3 選擇

綜合下面幾種情況考慮最后選擇了 Ip2region1.數(shù)據(jù)來源和準(zhǔn)確性:數(shù)據(jù)是否完整、數(shù)據(jù)覆蓋率、精度和實效性等。

2.許可協(xié)議和商業(yè)使用:是否需要授權(quán)、是否可用于商業(yè)用途、是否收費等。

3.支持的語言和平臺

2.pom.xml依賴

我自己使用的springboot項目,基礎(chǔ)依賴就不列舉了

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.4.2</version>
    </dependency>
    <dependency>
        <groupId>org.lionsoul</groupId>
        <artifactId>ip2region</artifactId>
        <version>2.7.0</version>
    </dependency>
   <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>
</dependencies>

3.代碼示例

實體類接收國家、省市等信息。

@Data
public class IpLocation implements Serializable {

    @ApiModelProperty("ip地址")
    private String ip;

    @ApiModelProperty("國家")
    private String country;

    @ApiModelProperty("省")
    private String province;

    @ApiModelProperty("省")
    private String city;

    @ApiModelProperty("服務(wù)商")
    private String isp;
}

工具類:

@Slf4j
//@UtilityClass
public class IpUtils {

    /**
     * 字符常量0
     */
    private static final String ZERO="0";
    /**
     * 本級ip
     */
    private static final String LOCALHOST="127.0.0.1";

    /**
     * 獲取客戶端的IP地址
     */
    public static String getIpAddress(HttpServletRequest request) {
        String ipAddress = request.getHeader("X-Forwarded-For");
        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.getRemoteAddr();
            if (LOCALHOST.equals(ipAddress)) {
                // 根據(jù)網(wǎng)卡取本機配置的IP
                InetAddress inet = null;
                try {
                    inet = InetAddress.getLocalHost();
                    ipAddress = inet.getHostAddress();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
            }
        }
        // 對于通過多個代理轉(zhuǎn)發(fā)的情況,取第一個非unknown的IP地址。
        // 這里假設(shè)第一個IP為真實IP,后面的為代理IP。
        if (ipAddress != null && ipAddress.length() > 15) {
            if (ipAddress.indexOf(",") > 0) {
                ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
            }
        }
        return ipAddress;
    }

    /**
     * 根據(jù)iP獲取歸屬地信息
     * @return
     */
    public static IpLocation getLocation(String ip) {
        IpLocation location = new IpLocation();
        location.setIp(ip);
        try (InputStream inputStream = IpUtils.class.getResourceAsStream("/ip2region.xdb");) {
            byte[] bytes = IoUtil.readBytes(inputStream);
            Searcher searcher = Searcher.newWithBuffer(bytes);
            String region = searcher.search(ip);
            if (StrUtil.isAllNotBlank(region)) {
                // xdb返回格式 國家|區(qū)域|省份|城市|ISP,
                // 只有中國的數(shù)據(jù)絕大部分精確到了城市,其他國家部分?jǐn)?shù)據(jù)只能定位到國家,后前的選項全部是0
                String[] result = region.split("\\|");
                location.setCountry(ZERO.equals(result[0])?StrUtil.EMPTY:result[0]);
                location.setProvince(ZERO.equals(result[2])?StrUtil.EMPTY:result[2]);
                location.setCity(ZERO.equals(result[3])?StrUtil.EMPTY:result[3]);
                location.setIsp(ZERO.equals(result[4])?StrUtil.EMPTY:result[4]);
            }
            searcher.close();
        } catch (Exception e) {
            log.error("ip地址解析異常,error:{}",e);
            return location;
        }
        return location;
    }
}

在官網(wǎng)地址,將data目錄下的ip2region.xdb文件復(fù)制到resource下。

在百度輸入ip地址查詢,可以查到自己本地公網(wǎng)地址,測試如下(這里為了方便,直接寫在了工具類里):

如果需要測試 IP 地址查詢功能,可以嘗試使用一些公共的 IP 地址,例如:

  • 8.8.8.8:谷歌公共 DNS 地址,位于美國。
  • 114.114.114.114:中國電信公共 DNS 地址,位于中國。
  • 1.1.1.1:Cloudflare 公共 DNS 地址,位于澳大利亞。
  • 208.67.222.222:OpenDNS 公共 DNS 地址,位于美國。
  • 176.103.130.130:AdGuard 公共 DNS 地址,位于荷蘭。

總結(jié) 

到此這篇關(guān)于java如何根據(jù)用戶請求獲取ip地址并解析省市信息的文章就介紹到這了,更多相關(guān)java獲取ip地址解析省市內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java基礎(chǔ)理論Stream的Filter與謂詞邏輯

    java基礎(chǔ)理論Stream的Filter與謂詞邏輯

    這篇文章主要為大家介紹了java基礎(chǔ)理論Stream的Filter與謂詞邏輯,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java SpringBoot啟動指定profile的8種方式詳解

    Java SpringBoot啟動指定profile的8種方式詳解

    這篇文章主要介紹了spring boot 如何指定profile啟動的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring中Bean的生命周期原理解析:實例化、屬性賦值、初始化、運行期和銷毀

    Spring中Bean的生命周期原理解析:實例化、屬性賦值、初始化、運行期和銷毀

    本文詳細(xì)介紹了Spring IOC容器中Bean的生命周期管理,包括實例化、屬性賦值、初始化方法、Bean運行期和銷毀方法,通過示例展示了如何使用XML配置和注解方式來定義初始化和銷毀方法,并解釋了這些方法的特性和使用規(guī)則
    2026-01-01
  • SpringBoot 過濾器、攔截器、監(jiān)聽器對比及使用場景分析

    SpringBoot 過濾器、攔截器、監(jiān)聽器對比及使用場景分析

    過濾器是處于客戶端和服務(wù)器資源文件之間的一道過濾網(wǎng),這篇文章主要介紹了SpringBoot 過濾器、攔截器、監(jiān)聽器對比及使用場景分析,需要的朋友可以參考下
    2021-05-05
  • Spring @Transactional 自調(diào)用問題深度解析及解決方案

    Spring @Transactional 自調(diào)用問題深度解析及解決方案

    這篇文章主要介紹了Spring @Transactional 自調(diào)用問題深度解析及解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • 詳解Spring Bean 之間的特殊關(guān)系

    詳解Spring Bean 之間的特殊關(guān)系

    在 Spring 容器中,兩個 Bean 之間除了通過 <ref> 建立依賴關(guān)系外,還存在著一些特殊關(guān)系。這篇文章給大家想想介紹了Spring Bean 之間的特殊關(guān)系,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2018-05-05
  • Java編程實現(xiàn)游戲中的簡單碰撞檢測功能示例

    Java編程實現(xiàn)游戲中的簡單碰撞檢測功能示例

    這篇文章主要介紹了Java編程中的簡單碰撞檢測功能,涉及java針對坐標(biāo)點的相關(guān)數(shù)學(xué)運算操作技巧,需要的朋友可以參考下
    2017-10-10
  • 配置springboot項目動靜分離打包分離lib方式

    配置springboot項目動靜分離打包分離lib方式

    本文介紹了如何將Spring?Boot工程中的靜態(tài)資源和配置文件分離出來,以減少jar包大小,方便修改配置文件,通過在jar包同級目錄創(chuàng)建config目錄,并在pom文件中進(jìn)行相應(yīng)配置,可以實現(xiàn)配置文件的外部化,打包后的jar包和lib文件夾中分別存放了第三方j(luò)ar包和靜態(tài)資源文件
    2025-02-02
  • Maven項目外部jar包導(dǎo)入的實現(xiàn)示例

    Maven項目外部jar包導(dǎo)入的實現(xiàn)示例

    在Maven項目里,我們經(jīng)常需要導(dǎo)入jar包依賴,本文主要介紹了Maven項目外部jar包導(dǎo)入的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • java語言基礎(chǔ)之標(biāo)識符和命名規(guī)則詳解

    java語言基礎(chǔ)之標(biāo)識符和命名規(guī)則詳解

    這篇文章主要給大家介紹了關(guān)于java語言基礎(chǔ)之標(biāo)識符和命名規(guī)則的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

马关县| 富源县| 漳州市| 襄汾县| 舒城县| 海阳市| 福清市| 乐亭县| 双流县| 察哈| 肃宁县| 宜良县| 体育| 晋州市| 奎屯市| 玉田县| 南华县| 武胜县| 大理市| 龙州县| 顺昌县| 石门县| 山东省| 会昌县| 海丰县| 新邵县| 东光县| 墨脱县| 宁德市| 湟中县| 资兴市| 盘锦市| 民乐县| 铜陵市| 六安市| 任丘市| 平昌县| 来安县| 青海省| 来宾市| 莎车县|