java实现根据实现根据ip地址获取地理位置地址获取地理位置
本文给大家汇总介绍了2种分别使用新浪和淘宝接口,实现根据IP地址获取详细的地理位置的代码,非常的实
用,有需要的小伙伴可以参考下。
最近项目某个功能需要根据ip地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾
讯的。试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩溃。下面例子是新浪的,
例子不是适合每个项目,需要改一下.
/**
ipSearchUrl=http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=(这是新浪的接口地址)
在项目中新浪的接口地址没有直接写死,而是去读属性文件。
*/
public static String getIpInfoBySina(String ip){
// 读取属性文件(属性文件key-value和格式)
final String PROP_IPSEARCHURL="ipSearchUrl";
final String RET_SUCCESS="1";
final String RET="ret";
final String PROVINCE="province";
final String CITY="city";
final String DISTRICT="district";
final String ISP="isp";
String ipAddress="";
if(StringUtils.isBlank(ip)){
return null;
}
String url = SystemParamPropertyUtils.getSystemParamKeyValue(PROP_IPSEARCHURL);//这个是从属性文件中获取url,即新浪接口地址
if(StringUtils.isNotBlank(url)){
String path=url+ip;//"http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip="+ip;
HttpClient httpClient = new HttpClient();
Map<String, String> paramMap = new HashMap<String, String>();
String remoteIpInfo="";
try {
remoteIpInfo = HttpClientUtil.request(httpClient, path, paramMap,"sina");
} catch (Exception e) {
e.printStackTrace();
}
if(StringUtils.isNotBlank(remoteIpInfo)){
String _ret=searchValue(remoteIpInfo, RET);
if(RET_SUCCESS.equals(_ret)){
String provinceName=searchValue(remoteIpInfo, PROVINCE);
String cityName=searchValue(remoteIpInfo, CITY);
String district=searchValue(remoteIpInfo, DISTRICT);
String isp=searchValue(remoteIpInfo, ISP);
ipAddress=provinceName+cityName+district+isp;
}
}
}
return ipAddress;
}
private static String searchValue(String remoteIpInfo,String key){
String _value="";
if(StringUtils.isNotBlank(remoteIpInfo)){
_value=StringUtils.substringBetween(remoteIpInfo,"\""+key+"\":", ",");
if(StringUtils.isNotBlank(_value)){
_value=UnicodeUtils.decodeUnicode(_value);
}
}
return _value;
}
读新浪的接口地址很快,我本人测试到了九万条左右,十分钟。淘宝的话一个多小时,五万多条。还有一个小技巧,就是把读
到的ip存到map中,然后下次读的话就直接从map取出,这样快很多。这个会衍生出很多问题,当日志文件达到百万级,千万
级,怎么解决。类似淘宝这样的,一秒多少订单,每个订单ip不一样。我不知道怎么解决。有大神知道回我一下。
下面是用淘宝的。
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;
/**
评论0