根据IP地址获取详细的地域信息

package com.itstyle.common.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 javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;

/**

* 根据IP地址获取详细的地域信息

*

*/

public class AddressUtils {

  /**

*

    * @param content

    *            请求的参数 格式为:name=xxx&pwd=xxx

    * @param encoding

    *            服务器端请求编码。如GBK,UTF-8等

    * @return

    * @throws UnsupportedEncodingException

    */

  public static String getAddresses(String ip) throws UnsupportedEncodingException {

      String urlStr ="http://ip.taobao.com/service/getIpInfo.php";

      String returnStr = getResult(urlStr, ip);

      if (returnStr != null) {

        // 处理返回的省市区信息

        String[] temp = returnStr.split(",");

        if (temp.length < 3) {

            return "0";// 无效IP,局域网测试

        }

        String region = (temp[5].split(":"))[1].replaceAll("\"", "");

        region = decodeUnicode(region);// 省份

        String country = "";

        String area = "";

        // String region = "";

        String city = "";

        String county = "";

        String isp = "";

        for (int i = 0; i < temp.length; i++) {

            switch (i) {

            case 1:

              country = (temp[i].split(":"))[2].replaceAll("\"", "");

              country = decodeUnicode(country);// 国家

              break;

            case 3:

              area = (temp[i].split(":"))[1].replaceAll("\"", "");

              area = decodeUnicode(area);// 地区

              break;

            case 5:

              region = (temp[i].split(":"))[1].replaceAll("\"", "");

              region = decodeUnicode(region);// 省份

              break;

            case 7:

              city = (temp[i].split(":"))[1].replaceAll("\"", "");

              city = decodeUnicode(city);// 市区

              break;

            case 9:

              county = (temp[i].split(":"))[1].replaceAll("\"", "");

              county = decodeUnicode(county);// 地区

              break;

            case 11:

              isp = (temp[i].split(":"))[1].replaceAll("\"", "");

              isp = decodeUnicode(isp); // ISP公司

              break;

            }

}

        String address = region+city;

        if(StringUtils.isBlank(address)){

            address = "地球村";

        }

        return address;

      }

      return null;

  }

  /**

    * @param urlStr

    *            请求的地址

    * @param content

    *            请求的参数 格式为:name=xxx&pwd=xxx

    * @param encoding

    *            服务器端请求编码。如GBK,UTF-8等

    * @return

    */

  private static String getResult(String urlStr, String ip) {

      URL url = null;

      HttpURLConnection connection = null;

      try {

        url = new URL(urlStr);

        connection = (HttpURLConnection) url.openConnection();// 新建连接实例

        /**

          * 超时错误 由 2s改为5s

*/

        connection.setConnectTimeout(5000);// 设置连接超时时间,单位毫秒

        connection.setReadTimeout(5000);// 设置读取数据超时时间,单位毫秒

        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("ip="+ip);// 写数据,也就是提交你的表单name=xxx&pwd=xxx

        out.flush();// 刷新

        out.close();// 关闭输出流

        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));// 往对端写完数据对端服务器返回数据

        // ,以BufferedReader流来读取

        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;

  }

  /**

    * unicode 转换成 中文

    * @param theString

    * @return

    */

  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();

  }

  /**

    * 获取IP地址

    * @Author  科帮网

    * @param request

    * @return  String

    * @Date  2017年7月31日

    * 更新日志

    * 2017年7月31日  科帮网 首次创建

    *

*/

    public static String getIpAddr(HttpServletRequest request)

{

        String ip = request.getHeader("X-Real-IP");

        if(!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip))

            return ip;

        ip = request.getHeader("X-Forwarded-For");

        if(!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip))

{

            int index = ip.indexOf(',');

            if(index != -1)

              return ip.substring(0, index);

            else

                return ip;

        }

        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.getHeader("HTTP_CLIENT_IP");

        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))

            ip = request.getHeader("HTTP_X_FORWARDED_FOR");

        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))

            ip = request.getRemoteAddr();

        return ip;

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358