微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 paramMap = new HashMap(); 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; /** * 根据IP地址获取详细的地域信息 * @author Lwl * @dateJan 26, 2016 */ 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐