java根据ip定位地理位置
在项目开发中,我们可能会遇到这样的需求:需要在登录日志或者操作日志中记录客户端ip所在的地理位置。目前根据ip定位地理位置的第三方api有好几个,淘宝、新浪、百度等,这三种其实也有些缺点的:淘宝,开始几次可以成功根据ip获取对应地理位置,但后面就莫名其妙开始不行,直接通过浏览器获取又可以;新浪,之前一直可以,但最近不知道为什么不行了,访问直接报错(可能api修改了或者取消了吧);百度,需要申请百度地图开发者平台的开发者账号,请求时接口中需要加上百度提供的秘钥等信息,我试了下,好像不能定位国外的ip。
IPLocation.java
/**
* 用来封装ip相关信息,目前只有两个字段,ip所在的国家和地区
*
*/
public class IPLocation {
private String country;
private String area;
public IPLocation() {
country = area = "";
}
public IPLocation getCopy() {
IPLocation ret = new IPLocation();
ret.country = country;
ret.area = area;
return ret;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getArea() {
return area;
}
public void setArea(String area) {
//如果为局域网,纯真IP地址库的地区会显示CZ88.NET,这里把它去掉
if(area.trim().equals("CZ88.NET")){
this.area="本机或本网络";
}else{
this.area = area;
}
}
}
Message.java
public class Message {
public static String bad_ip_file="IP地址库文件错误";
public static String unknown_country="未知国家";
public static String unknown_area="未知地区";
}
IPSeeker.java
PropertiesUtil.java
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 读取properties文件
*/
public class PropertiesUtil {
private static final Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);
private static Map<String, String> map = null;
public static String get(String key){
if(map == null) {
load();
}
return map.get(key);
}
public static Integer getInt(String key){
if(map == null) {
load();
}
String value = map.get(key);
return Integer.parseInt(value);
}
synchronized static private void load(){
logger.info("开始加载properties文件内容......");
map = new HashMap<String, String>();
Properties props = null;
InputStream in = null;
try {
props = new Properties();
in = PropertiesUtil.class.getClassLoader().getResourceAsStream("project.properties");
//防止properties中的中文读取出来后乱码
props.load(new InputStreamReader(in, "utf-8"));
Set<Entry<Object, Object>> entries = props.entrySet();
Iterator<Entry<Object, Object>> it = entries.iterator();
Entry<Object, Object> entry = null;
String key = null;
String value = null;
while(it.hasNext()){
entry = it.next();
key = (String)entry.getKey();
value = (String)entry.getValue();
map.put(key, value);
}
} catch (Exception e) {
e.printStackTrace();
logger.error("读取properties文件出现异常......");
} finally {
try {
if(null != in) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
logger.error("properties文件流关闭出现异常......");
}
}
logger.info("properties文件内容加载完成......");
}
}
