你們好,我是冰茶,容我開場先講個故事。
故事的通過是這樣的:php
有一天,產品同窗突發奇想,他想獲取到下單用戶的地理位置分佈,以便來統計用戶羣的分佈,進而爲後期的按地區精確推廣活動來作準備。前端
//建立RTCPeerConnection接口 let conn = new RTCPeerConnection({ iceServers: [] }) let noop = function(){} conn.onicecandidate = function(ice){ if (ice.candidate){ //使用正則獲取ip let ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/ let ip_addr = ip_regex.exec(ice.candidate.candidate)[1]; console.log(ip_addr) conn.onicecandidate = noop } } //隨便建立一個叫狗的通道(channel) conn.createDataChannel('dog') //建立一個SDP協議請求 conn.createOffer(conn.setLocalDescription.bind(conn),noop) 做者:Illgo 連接:https://www.zhihu.com/question/20675353/answer/335325619 來源:知乎 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
以後用 WebRTC獲取IP
等關鍵詞找了幾篇相似的文章。這個比較全面。後端
獲取訪問者內網IPapi
根據相似的文章,親自試驗了下,有兩個問題:服務器
這還查個毛線的查,因而......這個方案被放棄了......微信
備註:獲取用戶IP指引網絡
因而問題解決,大功告成~負載均衡
開玩笑,要真是這樣的話,這篇文章就不會出現了😀前後端分離
實際狀況是這樣的:運維
總之呢,這個任務,就落在前端這邊了。
好,如今讓咱們整理一下手頭的資源:
一個能直接獲取到IP的站,
一個能根據IP反查所在區域的接口
你問我爲啥不使用現成的服務呢?
主要是可靠性的緣由,若是是你用的外部服務,萬一服務掛了,一是隻能等到服務商修復,時效可能比較長,萬一服務商跑路了,還得費勁的切換服務;二是能夠甩鍋😀
下面是服務端的實現。
這部分實現呢,主要包含兩個部分:
首先咱們新建一個通常處理程序(.ashx)
下面是代碼清單:
/// <summary> /// 獲取客戶端IP地址 /// </summary> /// <param name="request"></param> /// <returns></returns> public static string GetAddress(HttpRequest request) { //能夠透過代理服務器 string remoteAddr = request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(remoteAddr)) { //沒有代理服務器,若是有代理服務器獲取的是代理服務器的IP remoteAddr = request.ServerVariables["REMOTE_ADDR"]; } if (!string.IsNullOrEmpty(remoteAddr) && remoteAddr.IndexOf(",") != -1 && remoteAddr.Trim().Length > 6) remoteAddr = remoteAddr.Split(',')[0].Trim(); if (remoteAddr.Length > 15) remoteAddr = GetIP4Address(); return remoteAddr; } public static string GetIP4Address() { string IP4Address = String.Empty; foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress)) { if (IPA.AddressFamily.ToString() == "InterNetwork") { IP4Address = IPA.ToString(); break; } } if (!string.IsNullOrEmpty(IP4Address)) { return IP4Address; } foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) { if (IPA.AddressFamily.ToString() == "InterNetwork") { IP4Address = IPA.ToString(); break; } } return IP4Address; }
而後呢,前端調用下暴露出的接口,就獲取到了所須要的地理信息。前端請求方法比較通用,就是一個很簡單的Ajax請求,這裏不作演示。
以後在下單時把獲取到的省市信息傳到下單接口裏面,這樣咱們就實現了獲取到前端用戶的IP,並根據IP來獲取地理定位的需求。
好了,正文就此結束。部分代碼稍後補充