导入依赖
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
完整解析代码
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.lionsoul.ip2region.Util;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.lang.reflect.Method;
@Slf4j
@Service
public class Ip2RegionService {
private DbConfig config = null;
private DbSearcher searcher = null;
/**
* 初始化IP库
*/
@PostConstruct
public void init() {
try {
config = new DbConfig();
searcher = new DbSearcher(config, Resources.getResourceAsFile("ip2region/ip2region.db").getPath());
log.info("bean [{}]", config);
log.info("bean [{}]", searcher);
} catch (Exception e) {
log.error("init ip region error:", e);
}
}
/**
* 解析IP
*
* @param ip
* @return
*/
public Region getRegion(String ip) {
try {
//db
if (searcher == null) {
log.error("DbSearcher is null");
return null;
}
//查询算法
int algorithm = DbSearcher.MEMORY_ALGORITYM;
//B-tree
//DbSearcher.BINARY_ALGORITHM //Binary
//DbSearcher.MEMORY_ALGORITYM //Memory
//define the method
Method method = null;
switch (algorithm) {
case DbSearcher.BTREE_ALGORITHM:
method = searcher.getClass().getMethod("btreeSearch", String.class);
break;
case DbSearcher.BINARY_ALGORITHM:
method = searcher.getClass().getMethod("binarySearch", String.class);
break;
case DbSearcher.MEMORY_ALGORITYM:
method = searcher.getClass().getMethod("memorySearch", String.class);
break;
}
DataBlock dataBlock = null;
if (!Util.isIpAddress(ip)) {
log.warn("warning: Invalid ip address");
}
dataBlock = (DataBlock) method.invoke(searcher, ip);
String region = dataBlock.getRegion();
String[] split = region.split("\\|");
return new Region(split[0], split[1], split[2], split[3], split[4]);
} catch (Exception e) {
log.error("error:{}", e.getLocalizedMessage());
}
return null;
}
public static class Region {
private String country;
private String area;
private String province;
private String city;
private String isp;
public Region(String country, String area, String province, String city, String isp) {
this.country = country;
this.area = area;
this.province = province;
this.city = city;
this.isp = isp;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getIsp() {
return isp;
}
public void setIsp(String isp) {
this.isp = isp;
}
@Override
public String toString() {
return "Region{" +
"country='" + country + '\'' +
", area='" + area + '\'' +
", province='" + province + '\'' +
", city='" + city + '\'' +
", isp='" + isp + '\'' +
'}';
}
}
}```