通過IP獲取使用者所在地址(後臺方式)
阿新 • • 發佈:2019-02-14
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();
}
}
}