1. 程式人生 > >通過IP獲取使用者所在地址(後臺方式)

通過IP獲取使用者所在地址(後臺方式)

mavenJSON包匯入配置:

  <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20160212</version>
</dependency>

如果沒有用maven則需要手動匯入jar包:json.jar

package com.company.item.util;

 import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONObject;

         /**
          * 根據IP地址獲取使用者當前登入的地址資訊    
          * @Copyright (C),滬友科技
          * @author zt
          * @Date:2016年3月28日
          */
    public class AddressUtils {  
      
       
        /*
         * 引數含義:
         *    dataURL       :訪問的介面路徑
         *    ip            :ip地址
         *    encodingString:所訪問介面規定的字符集編碼
         */
     /*傳入相關引數返回一個JSONObject組織的地址資料*/
     public static JSONObject getAddrMessage(String dataURL,String ip, String encodingString)
       throws UnsupportedEncodingException {
    
      String returnStr = getAreaDatas(dataURL, ip, encodingString);
     System.out.println(returnStr);
      if (returnStr != null) {
          
       /*介面返回的json型別字串轉換為JSON可以直接被轉換為相應的中文地址*/
           JSONObject jsonb = new JSONObject(returnStr);            

           String[] temp = returnStr.split(",");
           
       if(temp.length<3){
           
        return jsonb.put("msg", "IP地址無效");
       }
       
       return jsonb;

      }
      return null;
     }
         
     /*訪問介面;接收返回資料*/
     private static String getAreaDatas(String urlStr, String content, String encoding) {
         
      URL url = null;
      HttpURLConnection connection = null;
      try {
       url = new URL(urlStr);
       
       /*通過介面路徑,建立HTTP連線物件*/
       connection = (HttpURLConnection) url.openConnection();
       
       /*連線物件的一些屬性配置*/
       connection.setConnectTimeout(2000);//連線超時時間,單位毫秒
       
       connection.setReadTimeout(2000);//讀取資料超時時間,單位毫秒
       
       connection.setDoOutput(true);//是否開啟輸出流 true|false
       
       connection.setDoInput(true);//是否開啟輸入流true|false
       
       connection.setRequestMethod("POST");//提交方法POST|GET
       
       connection.setUseCaches(false);//是否快取true|false
       
       connection.connect();// 開啟連線埠
       
       /*資料互動物件流(向介面提供伺服器方傳送資料請求)*/
       DataOutputStream out = new DataOutputStream(connection.getOutputStream());//開啟輸出流往對端伺服器寫資料
       
       out.writeBytes(content);// 寫資料
       
       out.flush();// 重新整理
       
       out.close();// 關閉輸出流
       
       /*通過緩衝字元流接收伺服器返回的資料*/
       
       BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));// 往對端寫完資料對端伺服器返回資料

       StringBuffer buffer = new StringBuffer();
       String line = "";
       while ((line = reader.readLine()) != null) {
        buffer.append(line);
       }
       reader.close();
       
       return buffer.toString();
      } catch (IOException e) {
       e.printStackTrace();
      } finally {
       if (connection != null) {
        connection.disconnect();// 關閉連線
       }
      }
      return null;
     }
    
     /*如果沒用JSONObject物件則可以通過這個方法進行對應欄位unicode碼轉中文*/      
     public static String decodeUnicode(String theString) {
      char aChar;
      int len = theString.length();
      StringBuffer outBuffer = new StringBuffer(len);
      for (int x = 0; x < len;) {
       aChar = theString.charAt(x++);
       if (aChar == '\\') {
        aChar = theString.charAt(x++);
        if (aChar == 'u') {
         int value = 0;
         for (int i = 0; i < 4; i++) {
          aChar = theString.charAt(x++);
          switch (aChar) {
          case '0':
          case '1':
          case '2':
          case '3':
          case '4':
          case '5':
          case '6':
          case '7':
          case '8':
          case '9':
           value = (value << 4) + aChar - '0';
           break;
          case 'a':
          case 'b':
          case 'c':
          case 'd':
          case 'e':
          case 'f':
           value = (value << 4) + 10 + aChar - 'a';
           break;
          case 'A':
          case 'B':
          case 'C':
          case 'D':
          case 'E':
          case 'F':
           value = (value << 4) + 10 + aChar - 'A';
           break;
          default:
           throw new IllegalArgumentException(
             "Malformed      encoding.");
          }
         }
         outBuffer.append((char) value);
        } else {
         if (aChar == 't') {
          aChar = '\t';
         } else if (aChar == 'r') {
          aChar = '\r';
         } else if (aChar == 'n') {
          aChar = '\n';
         } else if (aChar == 'f') {
          aChar = '\f';
         }
         outBuffer.append(aChar);
        }
       } else {
        outBuffer.append(aChar);
       }
      }
      return outBuffer.toString();
     }
    
     /*
      * 相關主要欄位
      * {"country":"\u4e2d\u56fd",     國家      country
      * "country_id":"CN",
      * "area":"\u897f\u5357",         大地區   area
      * "area_id":"500000",
      * "region":"\u56db\u5ddd\u7701", 省份       region
      * "region_id":"510000",
      * "city":"\u6210\u90fd\u5e02",   城市       city
      * "city_id":"510100",
      * "county":"",                   市區       county
      * "county_id":"-1",
      * "isp":"\u7535\u4fe1",          網路(電信/網通/其他) isp
      * "isp_id":"100017",
      * "ip":"118.123.249.159"}
      * }
      */
      
     public static void main(String[] args) {
      AddressUtils addressUtils = new AddressUtils();
      // 測試ip 219.136.134.157  118.123.249.159
      String ip = "219.136.134.157";
      
      /*介面URL網路上有很多種*/
      String dataURL = "http://ip.taobao.com/service/getIpInfo.php";
      String address = "";
      try {
          
         /*這裡要注意有一個坑的地方:傳IP這個的時候 要傳"ip="+ip這種規則進行傳參否則獲取不到正確的資料*/
         JSONObject jsonb = getAddrMessage(dataURL,"ip="+ip,"utf-8");
             
         /*封裝為JSON資料更方便處理*/
         System.out.println(jsonb.getJSONObject("data").getString("region"));
         System.out.println(jsonb.getJSONObject("data").getString("isp"));
         
         /*
      System.out.println(addressUtils.decodeUnicode("\u4e2d\u56fd"));
      System.out.println(addressUtils.decodeUnicode("\u897f\u5357"));
      System.out.println(addressUtils.decodeUnicode("\u56db\u5ddd\u7701"));
      System.out.println(addressUtils.decodeUnicode("\u6210\u90fd\u5e02"));
      System.out.println(addressUtils.decodeUnicode("\u8d8a\u79c0\u533a"));
      System.out.println(addressUtils.decodeUnicode("\u7535\u4fe1"));
      */
      } catch (UnsupportedEncodingException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }

     }
    }