版权声明:有问题可联系博主QQ:15577969,大家一起相互交流和学习。 https://blog.csdn.net/qq15577969/article/details/86711456
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.JsonNode;
import com.maxmind.db.Reader;
import org.json.JSONObject;
/**
* IP地址解析工具类
*
* @author Administrator
*
*/
public class IPUtil {
private static Reader reader;
/**
* 通过IP获取地址(国家、省份、城市)
*
* @param ip
* @return
*/
public static Map<String, String> getAddressByIP(String ip) {
// 首先判断是否为内网ip
if (isInnerIP(ip)) {
return null;
}
Map<String, String> map = new HashMap<>();
/*----------------------------------------使用淘宝接口解析IP start----------------------------------------------*/
String path = "http://ip.taobao.com/service/getIpInfo.php";
String params="ip="+ip;
String returnStr = getResultByUrl(path, params, "utf-8");
JSONObject json = null;
if (returnStr != null) {
json = new JSONObject(returnStr);
if ("0".equals(json.get("code").toString())) {
//国家
String country=decodeUnicode(json.optJSONObject("data").getString("country"));
if (country != null){
map.put("country", country);
}
//省份
String province=decodeUnicode(json.optJSONObject("data").getString("region"));
if (province != null){
map.put("province", province);
}
//城市
String city=decodeUnicode(json.optJSONObject("data").getString("city"));
if (city != null){
map.put("city", city);
}
}
}
/*----------------------------------------使用淘宝接口解析IP end -----------------------------------------------*/
return map;
}
public static boolean isInnerIP(String ipAddress) {
boolean isInnerIp = false;
long ipNum = getIpNum(ipAddress);
/**
* 私有IP:A类 10.0.0.0-10.255.255.255 B类 172.16.0.0-172.31.255.255 C类
* 192.168.0.0-192.168.255.255 当然,还有127这个网段是环回地址
**/
long aBegin = getIpNum("10.0.0.0");
long aEnd = getIpNum("10.255.255.255");
long bBegin = getIpNum("172.16.0.0");
long bEnd = getIpNum("172.31.255.255");
long cBegin = getIpNum("192.168.0.0");
long cEnd = getIpNum("192.168.255.255");
isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd)|| ipAddress.equals("127.0.0.1");
return isInnerIp;
}
private static long getIpNum(String ipAddress) {
String[] ip = ipAddress.split("\\.");
long a = Integer.parseInt(ip[0]);
long b = Integer.parseInt(ip[1]);
long c = Integer.parseInt(ip[2]);
long d = Integer.parseInt(ip[3]);
long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
return ipNum;
}
private static boolean isInner(long userIp, long begin, long end) {
return (userIp >= begin) && (userIp <= end);
}
/**
* 从url获取结果
*
* @param path
* @param params
* @param encoding
* @return
*/
public static String getResultByUrl(String path, String params, String encoding) {
URL url = null;
HttpURLConnection connection = null;
try {
url = new URL(path);
connection = (HttpURLConnection) url.openConnection();// 新建连接实例
connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫S
connection.setReadTimeout(2000);// 设置读取数据超时时间,单位毫S
connection.setDoInput(true);// 是否打开输出S true|false
connection.setDoOutput(true);// 是否打开输入流true|false
connection.setRequestMethod("POST");// 提交方法POST|GET
connection.setUseCaches(false);// 是否缓存true|false
connection.connect();// 打开连接端口
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes(params);
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 (Exception e) {
e.printStackTrace();
} finally {
connection.disconnect();// 关闭连接
}
return null;
}
/**
* 字符转码
*
* @param theString
* @return
*/
public static String decodeUnicode(String theString) {
char aChar;
int len = theString.length();
StringBuffer buffer = new StringBuffer(len);
for (int i = 0; i < len;) {
aChar = theString.charAt(i++);
if (aChar == '\\') {
aChar = theString.charAt(i++);
if (aChar == 'u') {
int val = 0;
for (int j = 0; j < 4; j++) {
aChar = theString.charAt(i++);
switch (aChar) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
val = (val << 4) + aChar - '0';
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
val = (val << 4) + 10 + aChar - 'a';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
val = (val << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException("Malformed encoding.");
}
}
buffer.append((char) val);
} else {
if (aChar == 't') {
aChar = '\t';
}
if (aChar == 'r') {
aChar = '\r';
}
if (aChar == 'n') {
aChar = '\n';
}
if (aChar == 'f') {
aChar = '\f';
}
buffer.append(aChar);
}
} else {
buffer.append(aChar);
}
}
return buffer.toString();
}
}