根據ip獲取城市

github_zwl發表於2017-11-10

在web開發中,經常有需求,需要知道客戶使用者現在所在位置(城市),一般原理是這樣,第一:先通過request物件獲得遠端使用者的ip地址,第二:再利用第三方免費的(介面)服務,通過ip查詢出使用者的所在城市,

我擅長jsp,下面我們就已jsp為例:

       在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了 Apache,Nagix等反向代理(此處不懂反向代理請點選   點選開啟連結 )軟體就不能獲取到客戶端的真實IP地址了。如果使用了反向代理軟體,用 request.getRemoteAddr()方法獲取的IP地址是:127.0.0.1或 192.168.1.110,而並不是客戶端的真實IP。

      經過代理以後,由於在客戶端和服務之間增加了中間層,因此伺服器無法直接拿到客戶端的 IP,伺服器端應用也無法直接通過轉發請求的地址返回給客戶端。但是在轉發請求的HTTP頭資訊中,增加了X-FORWARDED-FOR資訊。用以跟蹤原有的客戶端 IP地址和原來客戶端請求的伺服器地址。

      舉例來說,當我們訪問口碑網首頁hangzhou.jsp時,其實並不是我們瀏覽器真正訪問到了伺服器上的hangzhou.jsp 檔案,而是先由代理伺服器Nagix去訪問hagnzhou.jsp ,代理伺服器再將訪問到的結果返回給我們的瀏覽器,因為是代理伺服器去訪問hangzhou.jsp的,所以hangzhou.jsp中通過 request.getRemoteAddr()的方法獲取的IP實際上是代理伺服器的地址,並不是客戶端的IP地址。但是head中增加了X-FORWARDED-FOR,我們可以通過request.getHeader("x-forwarded-for")來判斷是否是代理,

eg:


獲得客戶端真實IP地址的方法一:

public String getRemortIP(HttpServletRequest request) {
        if (request.getHeader("x-forwarded-for") == null) {
              return request.getRemoteAddr();
        }
        return request.getHeader("x-forwarded-for");
  }


------------------------------------------------------------------------------------------------------------


獲得客戶端真實IP地址的方法二

public String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        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.getRemoteAddr();
        }
        return ip;
  }

通過ip查詢城市

通過網路的IP查詢API 通過IP地址確定城市

這個辦法IP庫更新比較快。通用的庫有幾個比如google。

xml處理頁面完全可以通過nokogiri等專門處理工具代替。

提供IP地址查詢的API很多比如網易:


1.http://www.youdao.com/smartresult-xml/search.s?type=ip&q=IP地址

2. http://ip2loc.appspot.com/ #含有詳細例項講解, 但是由於GWF地址可能解析不到

3. 新浪的IP地址查詢介面:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js

4. 新浪多地域測試方法:http://int.dpool.sina.com.cn/ipl ... amp;ip=218.192.3.42

   #這個比較全,但是有個別ip解析的不對,打個資料庫沒有更新吧。。。。

5. 搜狐IP地址查詢介面(預設GBK):http://pv.sohu.com/cityjson

6. 搜狐IP地址查詢介面(可設定編碼):http://pv.sohu.com/cityjson?ie=utf-8

更多詳細請參考:www.cnblogs.com/lwm-1988/archive/2012/07/02/2573003.html

我一般使用新浪的:int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=後面寫那個ip字串

舉例:

int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42

返回一段js程式碼:

var remote_ip_info = {"ret":1,"start":"218.192.0.0","end":"218.192.7.255","country":"\u4e2d\u56fd","province":"\u5e7f\u4e1c","city":"\u5e7f\u5dde","district":"","isp":"\u6559\u80b2\u7f51","type":"\u5b66\u6821","desc":"\u5e7f\u5dde\u5927\u5b66\u7eba\u7ec7\u670d\u88c5\u5b66\u9662\u6559\u80b2\u7f51"};

利用eval執行這段程式碼:其中country代表國家或者地區,province代表省份,......

相關文章