package com.dotnar.wheatfield.util; import com.alibaba.fastjson.JSONObject; import com.dotnar.dto.BaseResp; import org.apache.log4j.Logger; import javax.servlet.http.HttpServletRequest; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * @author logshengtang * @ClassName: IPUtil * @Desc: Ip工具类 * @date 20170423 */ public class IPUtil { public final static Logger LOGGER = Logger.getLogger(IPUtil.class); /** * 获取访问用户的客户端IP(适用于公网与局域网). */ public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "nuknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "nuknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "nuknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } // 多个路由时,取第一个非unknown的ip final String[] arr = ip.split(","); for (final String str : arr) { if (!"unknown".equalsIgnoreCase(str)) { ip = str; break; } } return ip; } /** * 描述:获取IP+[IP所属地址] */ public static Map<String,String> getIpBelongAddress(HttpServletRequest request) { Map<String,String> ipMap = Collections.synchronizedMap(new HashMap<String, String>()); String ip = "未知"; String address ="未知"; try { ip = getIpAddress(request); address = getIPbelongAddress(ip); }catch (Exception e){ throw e; }finally { ipMap.put("ip",ip); ipMap.put("address",address); return ipMap; } } /** * 描述:获取IP所属地址 * * @param ip * @return */ public static String getIPbelongAddress(String ip) { String ipAddress = "[]"; try { //淘宝提供的服务地址 String context = call("http://ip.taobao.com/service/getIpInfo.php?ip=" + ip); JSONObject fromObject = JSONObject.parseObject(context); String code = fromObject.getString("code"); if (code.equals("0")) { JSONObject jsonObject = fromObject.getJSONObject("data"); ipAddress =jsonObject.get("country") + "/" + jsonObject.get("city"); } } catch (Exception e) { LOGGER.error("获取IP所属地址出错", e); e.printStackTrace(); } return ipAddress; } /** * 描述:获取Ip所属地址 * * @param urlStr */ public static String call(String urlStr) { try { URL url = new URL(urlStr); HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); httpCon.setConnectTimeout(3000); httpCon.setDoInput(true); httpCon.setRequestMethod("GET"); int code = httpCon.getResponseCode(); if (code == 200) { return streamConvertToSting(httpCon.getInputStream()); } } catch (Exception e) { LOGGER.error("获取IP所属地址出错", e); e.printStackTrace(); } return null; } /** * 描述:将InputStream转换成String * * @param is */ public static String streamConvertToSting(InputStream is) { String tempStr = ""; try { if (is == null) return null; ByteArrayOutputStream arrayOut = new ByteArrayOutputStream(); byte[] by = new byte[1024]; int len = 0; while ((len = is.read(by)) != -1) { arrayOut.write(by, 0, len); } tempStr = new String(arrayOut.toByteArray()); } catch (IOException e) { e.printStackTrace(); } return tempStr; } /** * 获取ip归属地 * * @param ip * @return */ public static BaseResp<String> getAttribution(String ip) { String context = call(ip); System.out.println("context=="+context); JSONObject fromObject = JSONObject.parseObject(context); System.out.println("fromObject==" + fromObject); String code = fromObject.getString("code"); if (!"0".equals(code)) { return BaseResp.buildFail("返回失败" + fromObject.get("data")); } JSONObject jsonObject = fromObject.getJSONObject("data"); Object country = jsonObject.get("country"); if (country == null) { return BaseResp.buildFail("获取归属国家失败"); } if ("未分配或者内网IP".equals(country)) { return BaseResp.buildFail("未分配或者内网IP"); } System.out.println(fromObject); System.err.println(jsonObject.get("city")); IpInfo ipInfo = jsonObject.toJavaObject(IpInfo.class); return BaseResp.build(ipInfo.result()); } public static void main(String[] args) { String context = call("http://ip.taobao.com/service/getIpInfo.php?ip=120.192.182.1"); // String context = call("http://ip.taobao.com/service/getIpInfo.php?ip=183.49.85.221"); // String context = call("http://ip.taobao.com/service/getIpInfo.php?ip=0:0:0:0:0:0:0:1"); // String context = call("http://ip.taobao.com/service/getIpInfo.php?ip=192.168.0.109"); // String url = "http://ip.taobao.com/service/getIpInfo.php?ip=120.192.182.1"; // String url = "http://ip.taobao.com/service/getIpInfo.php?ip=120.192.182.1"; String url = "http://ip.taobao.com/service/getIpInfo.php?ip=0:0:0:0:0:0:0:1"; // String url = "http://ip.taobao.com/service/getIpInfo.php?ip=183.49.85.221"; BaseResp<String> attribution = getAttribution(url); System.out.println(attribution + "==========" + (attribution.isOk() ? attribution.getData() : "")); } }