通过IP地址获取地理位置

原创
2016/04/20 14:33
阅读数 298

根据ip地址查询地理位置

package com.jmsht.util;

import java.io.BufferedReader;  
import java.io.DataOutputStream;  
import java.io.InputStreamReader;  
import java.net.HttpURLConnection;  
import java.net.URL;  
  
import org.json.JSONObject;  
  
/**
 * 根据IP地址获取地理位置
 * @author Administrator
 *
 */
public class AddressUtils {  
  
      
      
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
          
        AddressUtils addressUtils = new AddressUtils();  
          
          String ip = "183.16.7.126";  
            
          String address = "";  
            
          try {  
                
          address = addressUtils.getAddress("ip="+ip, "utf-8");  
             
          } catch (Exception e) {  
                
              e.printStackTrace();  
          }  
            
          System.out.println(address);  
            
  
    }  
    /** 
     * 获取地址 
     * @param params 
     * @param encoding 
     * @return 
     * @throws Exception 
     */  
    public static String getAddress(String params, String encoding) throws Exception{  
          
        String path = "http://ip.taobao.com/service/getIpInfo.php";  
          
        String returnStr = getRs(path, params, encoding);  
          
        JSONObject json=null;  
          
        if(returnStr != null){  
              
            json = new JSONObject(returnStr);  
              
            if("0".equals(json.get("code").toString())){  
                  
                StringBuffer buffer = new StringBuffer();  
                  
//                buffer.append(decodeUnicode(json.optJSONObject("data").getString("country")));//国家  
                  
//                buffer.append(decodeUnicode(json.optJSONObject("data").getString("area")));//地区  
                  
                buffer.append(decodeUnicode(json.optJSONObject("data").getString("region")));//省份  
                  
                buffer.append(decodeUnicode(json.optJSONObject("data").getString("city")));//市区  
                  
//                buffer.append(decodeUnicode(json.optJSONObject("data").getString("county")));//地区  
                  
//                buffer.append(decodeUnicode(json.optJSONObject("data").getString("isp")));//ISP公司  
                  
                System.out.println(buffer.toString());  
                  
                return buffer.toString();  
                  
            }else{  
                  
                return "获取地址失败";  
                  
            }  
              
        }  
          
        return null;  
          
    }  
    /** 
     * 从url获取结果 
     * @param path 
     * @param params 
     * @param encoding 
     * @return 
     */  
    public static String getRs(String path, String params, String encoding){  
          
        URL url = null;  
          
        HttpURLConnection connection = null;  
              
        try {  
              
            url = new URL(path);  
                  
            connection = (HttpURLConnection)url.openConnection();// 新建连接实例  
                  
            connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫秒?  
              
            connection.setReadTimeout(2000);// 设置读取数据超时时间,单位毫秒?  
              
            connection.setDoInput(true);// 是否打开输出流? 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();  
          
    }  
  
}

服务器获取ip

/* 获取客户端IP地址*/
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();
    }
   /*通过客户端IP获得客户端的城市地址*/
String city = GetUserAddress.getAddresses("ip="+ip, "utf-8");
request.getSession().setAttribute("city", city);


展开阅读全文
打赏
1
9 收藏
分享
加载中
更多评论
打赏
0 评论
9 收藏
1
分享
返回顶部
顶部