根据ip地址获得详细地址

/**

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

 */

public class IpUtils {  

    /** 获取IP */

    public static String getIp(HttpServletRequest request) {

       String ip = request.getHeader("x-forwarded-for");

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

       }

       return ip;

    }

   

    /**

     * 获取指定IP的区域位置

     * @param content

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

     * @param encoding

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

     * @return

     * @throws UnsupportedEncodingException

     */

    public static String getAddresses(String content, String encodingString)

           throws UnsupportedEncodingException {

       // 这里调用pconline的接口

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

       // http://whois.pconline.com.cn取得IP所在的省市区信息

       String returnStr = getResult(urlStr, content, encodingString);

       if (returnStr != null) {

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

           System.out.println(returnStr);

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

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

//            System.out.println(">>>"+temp[i]);

//         }

           if (temp.length < 3) {

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

           }

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

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

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

           region = decodeUnicode(region);// 省份

           city = decodeUnicode(city);// 省份

           isp = decodeUnicode(isp);// 省份

           return region + city + "[" + isp+"]";

       }

       return null;

    }

 

    /**

     * @param urlStr

     *            请求的地址

     * @param content

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

     * @param encoding

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

     * @return

     */

    private static String getResult(String urlStr, String content, String encoding) {

       URL url = null;

       HttpURLConnection connection = null;

       try {

           url = new URL(urlStr);

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

           out.flush();// 刷新

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

           BufferedReader reader = new BufferedReader(new InputStreamReader(

                  connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据

           // ,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 转换成 中文

     *

     * @author fanhui 2007-3-15

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

    }

 

    // 测试

    public static void main(String[] args) {

       AddressUtils addressUtils = new AddressUtils();

       String ip = "指定ip";

       String address = "";

       try {

           address = addressUtils.getAddresses("ip=" + ip, "utf-8");

       } catch (UnsupportedEncodingException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       System.out.println(address);

    }

}

转载于:https://my.oschina.net/u/1470832/blog/501732

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值