`

JAVA根据IP地址获取详细的地域信息(转)

    博客分类:
  • java
阅读更多

 

文章出自:http://hejianke83.blog.163.com/blog/static/60765162012101694919149/

非常感谢这位大哥,解决了我的问题。

 

        在系统中,网站的头部一般都有显示是哪个城市的,用户进入到网站的首页后,默认城市应该是用户本地的城市信息,例如:北京,网站就要根据你的IP地址的信息,查询数据,获取北京部分的数据,呵呵,当然我可能描述的不是很清楚,但是可以理解成,通过IP地址定位地理信息就行。很多人现在使用以QQ数据库为基础获取地址信息,但不完整、而且不规范。互联网提供很多其他接口可以完成这项功能.

接口如下:

通过淘宝IP地址库获取IP位置

1. 请求接口(GET):http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串]
2. 响应信息:(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商
3. 返回数据格式:
{
    "code": 0,
    "data": {
        "ip": "210.75.225.254",
        "country": "中国",
        "area": "华北",
        "region": "北京市",
        "city": "北京市",
        "county": "",
        "isp": "电信",
        "country_id": "86",
        "area_id": "100000",
        "region_id": "110000",
        "city_id": "110000",
        "county_id": "-1",
        "isp_id": "100017"
    }
}
其中code的值的含义为,0:成功,1:失败。
新浪的接口 :http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.192.3.42
返回值
var remote_ip_info = {
    "ret": 1,
    "start": "218.192.0.0",
    "end": "218.192.7.255",
    "country": "中国",
    "province": "广东",
    "city": "广州",
    "district": "",
    "isp": "教育网",
    "type": "学校",
    "desc": "广州大学纺织服装学院"
}
通过jqry 获取相应的数据
$.getScript('数据接口',function(){
//新浪:remote_ip_info.country
})
根据腾讯IP分享计划的地址获取IP所在地

实例:

package com.gocheck.common.utils.ipmanager;
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;
/**
 *  根据IP地址获取详细的地域信息
 *  @project:personGocheck
 *  @class:AddressUtils.java
 *  @author:heguanhua E-mail:37809893@qq.com
 *  @date:Nov 14, 2012 6:38:25 PM
 */
public class AddressUtils {  
 /**
  * 
  * @param content
  *            请求的参数 格式为:name=xxx&pwd=xxx
  * @param encoding
  *            服务器端请求编码。如GBK,UTF-8等
  * @return
  * @throws UnsupportedEncodingException
  */
 public 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 = this.getResult(urlStr, content, encodingString);
  if (returnStr != null) {
   // 处理返回的省市区信息
   System.out.println(returnStr);
   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; } }
    */
   // System.out.println(country+"="+area+"="+region+"="+city+"="+county+"="+isp);
   return region;
  }
  return null;
 }
 /**
  * @param urlStr
  *            请求的地址
  * @param content
  *            请求的参数 格式为:name=xxx&pwd=xxx
  * @param encoding
  *            服务器端请求编码。如GBK,UTF-8等
  * @return
  */
 private 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();
  // 测试ip 219.136.134.157 中国=华南=广东省=广州市=越秀区=电信
  String ip = "122.49.20.247";
  String address = "";
  try {
   address = addressUtils.getAddresses("ip="+ip, "utf-8");
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println(address);
  // 输出结果为:广东省,广州市,越秀区
 }
} 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java根据ip获取位置

    java根据ip获取位置 根据IP地址获取详细的地域信息 淘宝API 新浪API

    java根据ip地址获取详细地域信息的方法

    在互联网技术中,根据IP地址获取用户的地理位置是一个常见的需求。例如,网站可能需要根据访问者的IP来提供地区性的服务或内容。Java作为广泛使用的编程语言,提供了多种方法实现通过IP地址查询地理位置信息。 首先...

    【Java】通过ip地址获取详细地域信息(不通过API使用本地库)-调用库

    总结来说,`geoip2-2.12.0.jar`是一个强大的Java库,可以帮助我们高效地通过IP地址获取详细的地理位置信息。结合GeoIP2或GeoLite2数据库,开发者可以在自己的应用程序中轻松实现IP地址的地理位置查询,从而提升用户...

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

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

    IP工具类,通过传入的request获取ip地址(JAVA)

    本篇文章将详细解释如何在Java环境下,通过Servlet和Reactive编程模型来获取HTTP请求中的IP地址。 首先,让我们从Servlet API开始。Servlet是Java用于构建动态Web应用程序的标准接口。在Servlet中,我们通常使用`...

    用Java来获取访问者真实的IP地址

    ### 使用Java获取访问者真实IP地址 在现代Web开发中,获取客户端的真实IP地址是非常重要的。这不仅有助于网站统计分析,还可以用于安全控制、地域限制等功能。然而,在使用如Apache、Squid等反向代理服务器的情况下...

    解析Java根据ip查询所在地区

    这些库提供了API接口,允许开发者通过给定的IP地址获取国家、城市、经纬度等信息。首先,你需要下载并引入相应的库到你的项目中,然后按照以下步骤进行操作: 1. **初始化数据库**: 使用GeoIP2提供的API加载数据库...

    JS获取ip地址归属地

    在网络开发中,获取用户的 IP 地址归属地是非常有用的功能,例如在电商平台中可以根据用户的 IP 地址归属地进行物流信息的显示和管理。在这篇文章中,我们将使用 JS 调用第三方 API 获取 IP 归属地,简单方便实用。 ...

    获取指定IP的区域位置 java代码

    根据IP地址获取详细的地域信息 获取指定IP的区域位置 java代码

    ip地址所属地域解析

    在编程中,此类可能包含了获取和解析IP地址到地域信息的方法。可能包括了IP到经纬度的转换,或者与预定义的IP地址数据库进行匹配,以确定IP的国家、地区、城市等详细信息。 接着,"IMGFilter.java"可能是一个图像...

    把IP地址转换成实际地域名称

    而将其转换成实际的地域信息,如国家、地区和街道名称,能够帮助我们了解网络活动的来源地,对于业务分析和用户行为研究具有重要意义。 首先,我们需要了解IP地址的工作原理。IP地址分为IPv4和IPv6两种类型,IPv4由...

    Java实现IPV6地址查询

    2. **创建IPv6Bean对象**:为每个查询的IPv6地址创建一个`IPv6Bean`实例,存储IP地址本身以及后续查询得到的地理位置信息。 3. **执行查询**:在`IpV6Seeker`类中,实现一个方法,接受IPv6地址作为参数,使用ZX库的...

    ip地域对照表及使用方法

    使用时,你可以通过编程语言(如Python、Java、C#等)读取IP地域对照表文件,然后通过比较目标IP地址与表中的IP范围,查找对应的地理位置。对于大型的IP库,可以考虑使用数据库管理系统进行高效查询。如果选择使用...

    jsp程序 用户IP地址所在地记录

    在开发Web应用程序时,有时我们需要获取并记录用户的IP地址,以便了解用户来自哪里,这有助于进行数据分析、安全监控以及提供地域性服务。本项目“jsp程序 用户IP地址所在地记录”正是针对这一需求而设计的。它包含...

    IP地址转城市 通过IP得知访客地址 全国各地IP地址数据库

    标题中的“IP地址转城市 通过IP得知访客地址 全国各地IP地址数据库”指的是一个用于定位IP地址对应地理位置的数据库系统。这样的系统通常包含了大量IP地址范围及其对应的省份和城市信息,使得开发者和服务提供商能够...

    jsp获取客户端IP地址的方法.docx

    本文将详细介绍几种在JSP环境中获取客户端IP地址的有效方法,并提供实际的代码示例。 #### 二、获取客户端IP地址的重要性 1. **安全性**:通过识别用户的真实IP地址,可以帮助防止恶意攻击。 2. **统计分析**:收集...

    ip.7z ip数据库 可以根据ip获取到相应的省市

    为了使用这个数据库,你需要先解压“ip.7z”文件,然后使用适当的工具(如Python、Java或PHP)读取并解析“ip”文件,接着通过编程接口(API)或者直接查询来获取特定IP地址的位置信息。 总的来说,这个资源为...

    IP所属地域查询

    标题中的“IP所属地域查询”指的是通过特定的技术手段获取一个IP地址所对应的地理位置信息。在互联网上,每个设备在连接网络时都会被分配一个唯一的IP地址,这个地址可以用来识别设备在网络上的位置。IP归属地查询是...

    handsome获取ip+地区工具包

    总之,"handsome获取ip+地区工具包"提供了一种便捷的方式来获取和解析客户端IP地址,并结合纯真IP数据库提供地区信息。这对于需要进行地域性服务或数据分析的Java开发者来说,是一个非常实用的工具。

    根据ip判断所在城市

    在IT行业中,根据IP地址判断用户所在城市是一项常见的任务,主要应用于地理位置服务、网络分析、个性化推荐等场景。这项技术的基础是IP地址与地理位置之间的映射关系,这通常通过IP库或者API服务来实现。 首先,...

Global site tag (gtag.js) - Google Analytics