1.前言
正在做一個根據公網ip來定位到大體的位置,一般是精確到城市或地區,
如果想要精確到街道和地圖一一對應,那得使用GPS才可以,這里不討論。
2.科普
公網也就是外網,由運營商的機房服務器自動給每一個用戶分配一個IP地址,
每次登錄上網它都會自動分配一個,如果是專線如光纖上網,那外網IP就是電信給固定IP,是不會變。
我們的設備一般都是在一個區域內,共同使用一個公網ip,而我們則使用該公網ip下分的子接口,不同的接口還可以設置不同的內網,也就是家里的wifi等局域網。
維度公網ip被划分后則不可變的,是固定位置的,因此可以作為定位功能的依據。
3.網上博客流行ip定位方式分三種:
方式一:前端訪問第三方網址,無需ip參數,返回結果為該設備瀏覽器的公網ip地理信息;
缺點: 可能會遇到跨域訪問服務器拒絕處理的問題,報錯代碼403;
優點:速度快;
方式二:前端訪問第三方網址,需要指定ip參數,一般是ipv4,或者設備瀏覽器的經緯度,
返回結果為該指定ip參數的地理信息。
缺點: 可能會遇到跨域訪問服務器拒絕處理的問題,報錯代碼403;
優點:速度快;
【
那么,這就需要提前獲取ip參數,獲取方式有兩種,
第一:訪問第三方網址,返回公網ip參數,(需要第三方網址服務器允許前端跨域訪問才可以);
第二,前端訪問自己的服務器,服務器解析前端請求獲取公網ip參數。
】
方式三:訪問自己的服務器,根據前端的公網ip參數,由服務器訪問第三方網址,這樣就不會遇到跨域403問題,但是,也有可能會遇到中文亂碼,
需要提前手動調制
缺點:代碼量大,查詢速度慢,還有時候第三方服務器拒絕頻繁訪問,比如淘寶的接口,這就很蛋疼了;
優點:無跨域問題;
【如果不會服務器java訪問網址,看這篇博客介紹:https://www.cnblogs.com/charles8866/p/11162157.html】
4.探討第三方網址服務器的實現原理
上訴三種方法,其實歸根結底都是需要訪問第三方網址的服務器,等待它的處理結果,沒有給ip參數它就提取出發送請求
的瀏覽的的公網ip來查詢地理位置,如果有指定的ip參數則使用該參數查詢,然后根據ip參數,轉換成長整數,
(ip轉換成長整數的方法這里不細說了,有興趣的看他的這篇博客:https://www.iteye.com/blog/aokunsang-622498),
以長整數為查詢條件,去ip地址數據庫里查詢這個長整數的范圍就可以獲取對應的地理信息和提供的運營商,【ip地址數據庫因為每天都有局部變化,但是大體的是穩定不變的,所以網上只能找到更全的,而沒有全部的IP地址數據庫】,
查詢結果進行總結,然后一般使用json串的形式返回給請求端。
5.震驚
是不是很不可思議,就是這么簡單,而我們缺少的,正是這個ip地址庫,淘寶上有得賣,一般70塊錢左右!!!!
給的文件一般是access數據庫,當然,我們可以自己轉成自己使用的數據庫,如redis、mysql、oracle等,也可以錄入xml等文件,根據需要使用。
6.思考
其實,自己也可以制作一個ip服務接口,其實核心就是個查詢IP地址數據庫的操作而已,但是,我覺得沒這個必要,因為我只是想要
大體定位前端在哪個省哪個市哪個地區而已,就這么一個小功能,又不是商用, 沒必要花那么多錢買一個數據庫然后自己做一個查詢功能,
還不如使用別人的第三方免費接口,內容簡潔,速度還快,還可以分擔自己服務器的負擔,何樂而不為?
【雖然可以免費下載IP地址數據庫,但是一般不全面,還不好找】
7.網頁跨域問題
服務器其實可以設置防止外鏈的使用權限,可以讓瀏覽器跨域永遠403失敗!!!但是直接用瀏覽器訪問網址 卻可以正常使用,我苦難研究了一天才弄明白,
解決方法則是在服務端里進行url訪問,這樣沒不會出現這種跨域問題,太平洋網ip接口就是這樣
。
一般的跨域,ajax 和 <script src="http://xxx.xxx.xxx"></script> 這兩種方法都可以訪問,
比如使用搜狐的ip訪問接口
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
還有其他的方法,詳細的看這個博客: https://www.cnblogs.com/wws-bk/p/9770875.html
8.最后的妥協
考慮再三,希望查詢速度快,允許高頻率查詢,准確性高,關鍵是免費!!!
因此,我選擇用第三方網址IP接口
<script src="http://ip.ws.126.net/ipquery"></script>
測試返回結果:
很不錯!
也可以指定ip參數
不知道是哪位大佬做的,免費開放,這里先用着。