日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全网的 IP 归属地显示,带你5分钟加上,就是这么简单

發(fā)布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全网的 IP 归属地显示,带你5分钟加上,就是这么简单 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近,繼新浪微博之后,今日頭條、騰訊、抖音、知乎、快手、小紅書、百家號等各大平臺陸陸續(xù)續(xù)都上線了"網(wǎng)絡(luò)用戶IP地址顯示功能",境外用戶顯示的是國家,國內(nèi)的用戶顯示的省份,而且此項顯示無法關(guān)閉,歸屬地強制顯示;

作為技術(shù)人,那!這個功能要怎么實現(xiàn)呢?

其實要想實現(xiàn)這個功能還是非常的容易,基于現(xiàn)成 GeoLite2離線庫+免費的在線解析資源,5分鐘就能整合了;

在整合之前,我們先簡單了解一下,要想拿到用戶的位置信息,有那些方式:

終端定位

我們的手機等電子設(shè)備都是帶有GPS定位功能的,APP可以申請權(quán)限獲取用戶所處的經(jīng)緯度坐標,根據(jù)坐標,就可以知道到用戶所處的位置;比如百度、高德等地圖廠商,就提供了完善的SDK,能非常方便的集成到應(yīng)用,快速根據(jù)經(jīng)緯度獲取詳細的位置詳細;

優(yōu)點

  • 快捷;
  • 準確;
  • 誤差小。

缺點

  • 依賴硬件支持;
  • 依賴用戶授權(quán),如果用戶不授權(quán),APP將拿不到經(jīng)緯度信息,導(dǎo)致失敗;

IP地址解析

用戶向服務(wù)端發(fā)起的請求都會帶上IP地址,服務(wù)端拿到IP地址后,就能基于IP解析出用戶的所處的位置;

優(yōu)點

  • 無需授權(quán),只要用戶跟服務(wù)端交互,服務(wù)端就能拿到對應(yīng)的IP信息

缺點

  • 準確性不高,位置可能存在偏差;
  • IP庫更新不及時,導(dǎo)致部分IP歸屬地解析失敗。

三方終端上報

比如,我們騎共享單車的時候,我們的位置信息就是通過單車的設(shè)備上報到服務(wù)器;

優(yōu)點

  • 由三方終端基于GPS定位上報,不會獲取個人設(shè)備的信息;
  • 準確快捷;
  • 專業(yè)設(shè)備,誤差小;

缺點

  • 用戶無法干預(yù),信息會被迫強制上傳至服務(wù)端,用戶無法取消上傳;

下面就來試著將 GeoLite2 免費 IP 庫整合值SpringBoot項目,來獲取用戶的歸屬地信息;

1什么是GeoLite2?

GeoLite2數(shù)據(jù)庫是免費的IP地理定位數(shù)據(jù)庫;

優(yōu)點:

  • 離線庫,不需要網(wǎng)絡(luò)
  • 數(shù)據(jù)庫豐富
  • 速度快
  • 免費

缺點:

  • 準確度不高,存在偏差
  • 數(shù)據(jù)更新慢

2下載 GeoLite2 離線庫

官網(wǎng)地址:https://www.maxmind.com/en/home

下載過程稍微有點點麻煩,這里下載了一份最新的,放在網(wǎng)盤,需要測試的可以直接通過這個鏈接下載:https://www.123pan.com/s/xPY9-J37vH

3SpringBoot 獲取用戶的IP

  • 工具類public?class?IpUtils?{
    /**
    * 獲取用戶IP*?@param?request
    *?@return
    */
    public?static?String?getIpAddr(HttpServletRequest request)?{
    String ip = request.getHeader("x-forwarded-for");
    if?(ip ==?null?|| ip.length() ==?0?||?"unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("X-Real-IP");
    }if?(ip ==?null?|| ip.length() ==?0?||?"unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("http_client_ip");
    }if?(ip ==?null?|| ip.length() ==?0?||?"unknown".equalsIgnoreCase(ip)) {
    ip = request.getRemoteAddr();}if?(ip ==?null?|| ip.length() ==?0?||?"unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
    }if?(ip ==?null?|| ip.length() ==?0?||?"unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("WL-Proxy-Client-IP");
    }if?(ip ==?null?|| ip.length() ==?0?||?"unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    }// 如果是多級代理,那么取第一個ip為客戶ip
    if?(ip !=?null?&& ip.indexOf(",") != -1) {
    ip = ip.substring(ip.lastIndexOf(",") +?1).trim();
    }return?ip;
    }}
  • Controller獲取HttpServletRequest通過上面的工具類,即可獲取用戶請求的真實IP;為了避免重復(fù)工作,這里也可以使用AOP解析出用戶的IP信息,放到用戶的請求對象中@RestController
    public?class?IpController?{
    @GetMapping("/user/ip")
    public?String?userIp(HttpServletRequest request)?{
    // 這里就能拿到用戶的真實IP
    return?IpUtils.getIpAddr(request);
    }}

4SpringBoot 整合 GeoLite2

  • 添加依賴<dependency>
    <groupId>com.maxmind.geoip2</groupId>
    <artifactId>geoip2</artifactId>
    <version>2.3.0</version>
    </dependency>
    <dependency>
    <groupId>com.maxmind.db</groupId>
    <artifactId>maxmind-db</artifactId>
    <version>1.0.0</version>
    </dependency>
  • 工具類public?class?GeoIpUtils?{
    private?static?DatabaseReader reader;
    private?static?void?init()?{
    try?{
    // 創(chuàng)建 GeoLite2 數(shù)據(jù)庫 Reader
    // 這里可以放在本地磁盤,也可以隨項目放在resource目錄下
    File database =?new?File("F:\\web\\GeoLite2-City.mmdb");
    // 讀取數(shù)據(jù)庫內(nèi)容
    reader =?new?DatabaseReader.Builder(database).build();
    }?catch?(Exception ex) {
    }}public?static?void?getCityByIP(String ip)?throws?Exception {
    if?(null?== reader) {
    init();}InetAddress ipAddress = InetAddress.getByName(ip);// 獲取查詢結(jié)果
    CityResponse response = reader.city(ipAddress);// 獲取國家信息
    Country country = response.getCountry();System.out.println("國家信息:"?+ JSON.toJSONString(country));
    // 獲取省份
    Subdivision subdivision = response.getMostSpecificSubdivision();System.out.println("省份信息:"?+ JSON.toJSONString(subdivision));
    //城市
    City city = response.getCity();System.out.println("城市信息:"?+ JSON.toJSONString(city));
    // 獲取城市
    Location location = response.getLocation();System.out.println("經(jīng)緯度信息:"?+ JSON.toJSONString(location));
    }}
  • 測試public?static?void?main(String[] args)?throws?Exception {
    String ip =?"183.19.xxx.138";
    GeoIpUtils.getCityByIP(ip);}輸出結(jié)果:國家信息:{"geoNameId":1814991,"isoCode":"CN","name":"China","names":{"de":"China","ru":"Китай","pt-BR":"China","ja":"中國","en":"China","fr":"Chine","zh-CN":"中國","es":"China"}}
    省份信息:{"geoNameId":1809935,"isoCode":"GD","name":"Guangdong","names":{"en":"Guangdong","fr":"Province de Guangdong","zh-CN":"廣東"}}
    城市信息:{"geoNameId":1998011,"name":"Yanqianlaocun","names":{"en":"Yanqianlaocun","zh-CN":"巖前老村"}}
    經(jīng)緯度信息:{"accuracyRadius":500,"latitude":23.3255,"longitude":116.5007,"timeZone":"Asia/Shanghai"}

就這么簡單,輕輕松松就能拿到用戶IP所處的國家、省份、城市、經(jīng)緯度等詳細信息,可以根據(jù)自己的業(yè)務(wù)需要,對這些數(shù)據(jù)再做進一步的封裝。

5GeoLite2的其他用法

上面介紹的時SpringBoot整合GeoLite2,同樣在其他的一些場景下,也是可以利用GeoLite2獲取歸屬地信息;

  • 整合至Nignx,獲取用戶歸屬地信息Nginx 整合 GeoLite2 來解析用戶的歸屬地信息,在代理層就直接整理好對應(yīng)的數(shù)據(jù);
  • ELK中整合GeoLite2ELK 日志整理的時候,可以通過GeoLite2 獲取用戶的IP歸屬地信息;然后通過Kibana,就能非常直觀的展示用戶的地域分布情況;ELK搭建,這才是看日志的正確姿勢

6在線方案

上面一開始介紹GeoLite2時就列舉了其離線庫更新收錄不及時的問題,可能導(dǎo)致一些IP在離線庫中并不存在,查找的時候,就會報AddressNotFoundException的錯誤,如下示例:

遇到這種請求,我們要怎么辦呢?

下面就來介紹幾種在線IP歸屬地獲取的方式,當本地離線庫無法獲取的時候,就可以利用三方的在線庫,來補充完善;

在線獲取的優(yōu)點:

  • IP更新及時
  • 準確度高

缺點

  • 三方依賴性強
  • 需要付費,免費版本一般都有各種限制

以下示例中的xxx.xxx.xxx.xxx均代表ip地址;

百度

地址:https://opendata.baidu.com/api.php?query=xxx.xxx.xxx.xxx&resource_id=6006&co=&oe=utf8

響應(yīng)數(shù)據(jù):

{"status": "0","t": "","set_cache_time": "","data": [{"ExtendedLocation": "","OriginQuery": "183.19.xxx.138","appinfo": "","disp_type": 0,"fetchkey": "183.19.xxx.138","location": "廣東省肇慶市 電信","origip": "183.19.xxx.138","origipquery": "183.19.xxx.138","resourceid": "6006","role_id": 0,"shareImage": 1,"showLikeShare": 1,"showlamp": "1","titlecont": "IP地址查詢","tplt": "ip"}] }

status等于0表示成功,1表示失敗;可能存在status等于0,但是data中沒有數(shù)據(jù)的情況。

ip-api接口

  • 本機的IP信息http://ip-api.com/json/
  • 指定國際化http://ip-api.com/json/?lang=zh-CN
  • 指定IP查詢http://ip-api.com/json/xxx.xxx.xxx.xxx?lang=zh-CN返回數(shù)據(jù):{
    "status":?"success",
    "country":?"中國",
    "countryCode":?"CN",
    "region":?"GD",
    "regionName":?"廣東",
    "city":?"巖前老村",
    "zip":?"",
    "lat":?23.3255,
    "lon":?116.5007,
    "timezone":?"Asia/Shanghai",
    "isp":?"Chinanet",
    "org":?"Chinanet GD",
    "as":?"AS4134 CHINANET-BACKBONE",
    "query":?"183.19.xxx.138"
    }

搜狐IP查詢

地址:http://pv.sohu.com/cityjson?ie=utf-8

返回數(shù)據(jù)比較的簡單:

var returnCitySN = {"cip": "xxx.xxx.xxx.xxx", "cid": "440300", "cname": "廣東省深圳市"};

太平洋IP地址查詢

地址:http://whois.pconline.com.cn/ipJson.jsp?ip=xxx.xxx.xxx.xxx&json=true

返回數(shù)據(jù):

{"ip": "183.17.xxx.138","pro": "廣東省","proCode": "440000","city": "深圳市","cityCode": "440300","region": "","regionCode": "0","addr": "廣東省深圳市 電信","regionNames": "","err": "" }

淘寶API接口

http://ip.taobao.com/service/getIpInfo.php?ip=xxx.xxx.xxx.xxx

{"code": 0,"data": {"ip": "183.17.xxx.138","country": "中國","area": "","region": "廣東","city": "深圳","county": "XX","isp": "電信"} }

code等于0表示成功,1表示失敗

126

地址:https://ip.ws.126.net/ipquery?ip=xxx.xxx.xxx.xxx

響應(yīng)數(shù)據(jù):

var lo="廣東省", lc="肇慶市"; var localAddress={city:"肇慶市", province:"廣東省"}

響應(yīng)的數(shù)據(jù)比較的簡單

IP信息

地址:https://ip.useragentinfo.com/json?ip=xxx.xxx.xxx.xxx

響應(yīng)數(shù)據(jù):

{"country": "中國","short_name": "CN","province": "廣東省","city": "肇慶市","area": "德慶縣","isp": "電信","net": "","ip": "183.19.xxx.138","code": 200,"desc": "success" }

這么多的姿勢,實現(xiàn)起來是不是就非常的容易了;如果你對IP解析的需求比較依賴,也完全可以通過離線加這么多在線的方式,開發(fā)一個單獨的IP解析模塊,作為公司的基礎(chǔ)服務(wù),提供給內(nèi)部其他模塊使用。

示例目錄:https://github.com/vehang/ehang-spring-boot/tree/main/spring-boot-004-request-validate/src/main/java/com/ehang/validate/geoip

?

總結(jié)

以上是生活随笔為你收集整理的全网的 IP 归属地显示,带你5分钟加上,就是这么简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品18p | av免费网| 26uuu亚洲国产精品 | 国产高潮又爽又无遮挡又免费 | 久久中文视频 | 国产又粗又猛又爽又黄的网站 | 无码精品人妻一区二区三区湄公河 | 亚洲av无码电影在线播放 | 色七七桃花综合影院 | 国产视频第三页 | 天天干天天碰 | 黄色一级视频网站 | 色秀视频网 | 免费欧美黄色片 | 国产精品第五页 | 国产裸体无遮挡 | 国产免费无遮挡吸奶头视频 | 性感美女一区二区三区 | 国产三级自拍视频 | 精品蜜桃av | 亚洲精品在线视频免费观看 | 男人天堂怡红院 | 天天操欧美 | 黄色精彩视频 | 欧美福利第一页 | 91蝌蚪91密月| 色图社区| 十八岁世界在线观看高清免费韩剧 | 国产一区二区三区精品视频 | 男人插女人视频网站 | 午夜诱惑痒痒网 | 天堂中文在线免费观看 | 国产精品视频久久久久久久 | 亚洲丝袜天堂 | 国产亚洲自拍一区 | 91av视频网站| 亚洲精品中文字幕乱码三区 | 中文在线最新版天堂8 | 色窝| 丰满秘书被猛烈进入高清播放在 | 黄色视屏在线 | 91秘密入口| 欧美性视频网站 | 青青啪啪| 日本十八禁视频无遮挡 | 岳狂躁岳丰满少妇大叫 | 特级西西444www高清大胆 | 岛国大片在线观看 | 午夜寂寞少妇 | 草草在线观看 | 91香焦视频 | 五月少妇| 婷婷色中文字幕 | 狠狠干2018| 国产精品无码一区二区三区在线看 | 色爽爽爽爽爽爽爽爽 | 中文字幕人妻一区二区 | 炕上如狼似虎的呻吟声 | 国产精品无码电影 | 波多野在线观看 | 亚洲天堂手机在线观看 | 国产欧美日韩一区二区三区 | 7777久久亚洲中文字幕 | 久久综合成人 | 亚洲毛片在线播放 | 91av在线网站| 99产精品成人啪免费网站 | 国产黄色大全 | 亚洲夜夜操| 午夜伦理福利视频 | 亚洲春色av | 欧美一级在线免费 | 亚洲熟女乱色一区二区三区久久久 | 久久精品3| 日本人xxxⅹ18hd19hd | ass亚洲熟妇毛耸耸pics | 日韩欧美成人网 | 日本国产一级片 | 一级淫片免费 | 青青在线精品 | 亚洲区一区二 | 九九人人 | 97香蕉超级碰碰久久免费软件 | 激情视频国产 | 插插插操操操 | 精品网站999www | 欧美日韩在线免费观看视频 | 尹人av| 国产一级片免费在线观看 | 长腿校花无力呻吟娇喘的视频 | 草草影院地址 | 久久草视频 | 琪琪伦伦影院理论片 | 久久国产免费视频 | 欧美激情影院 | 免费久草视频 | 99无码熟妇丰满人妻啪啪 | 香蕉综合视频 | 久久春色 |