一、类展示
AddressUtils :
/**
* 获取地址类
*
*/
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class AddressUtils {
// 未知地址
public static final String UNKNOWN = "XX XX";
public static String getRealAddressByIP(String ip) {
if (StringUtils.isBlank(ip)) {
return UNKNOWN;
}
// 内网不查询
ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip);
if (NetUtil.isInnerIP(ip)) {
return "内网IP";
}
return RegionUtils.getCityInfo(ip);
}
}
RegionUtils :
ip资源库:ip2region.xdb 已经上传资源:
**
* 根据ip地址定位工具类,离线方式
* 参考地址:<a href="https://gitee.com/lionsoul/ip2region/tree/master/binding/java">集成 ip2region 实现离线IP地址定位库</a>
*
*/
@Slf4j
public class RegionUtils {
private static final Searcher SEARCHER;
// 初始化IP库:ip2region.xdb
static {
// 从classpath加载ip2region.xdb
String fileName = "/ip2region.xdb";
File existFile = FileUtils.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName);
// 如果文件不存在,则从classpath加载
if (!FileUtils.exist(existFile)) {
ClassPathResource fileStream = new ClassPathResource(fileName);
if (ObjectUtil.isEmpty(fileStream.getStream())) {
throw new ServiceException("RegionUtils初始化失败,原因:IP地址库数据不存在!");
}
FileUtils.writeFromStream(fileStream.getStream(), existFile);
}
String dbPath = existFile.getPath();
// 1、从 dbPath 加载整个 xdb 到内存。
byte[] cBuff;
try {
cBuff = Searcher.loadContentFromFile(dbPath);
} catch (Exception e) {
throw new ServiceException("RegionUtils初始化失败,原因:从ip2region.xdb文件加载内容失败!" + e.getMessage());
}
// 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。
try {
SEARCHER = Searcher.newWithBuffer(cBuff);
} catch (Exception e) {
throw new ServiceException("RegionUtils初始化失败,原因:" + e.getMessage());
}
}
/**
* 根据IP地址离线获取城市
*/
public static String getCityInfo(String ip) {
try {
ip = ip.trim();
// 3、执行查询
String region = SEARCHER.search(ip);
// 返回查询结果
return region.replace("0|", "").replace("|0", "");
} catch (Exception e) {
log.error("IP地址离线获取城市异常 {}", ip);
return "未知";
}
}
}
二、测试IP地址判断
@RestController
@SaIgnore
public class TestIPUtils {
@GetMapping("getIp")
public String getCityInfo() {
Console.log("空", AddressUtils.getRealAddressByIP(""));
Console.log("127.0.0.1",AddressUtils.getRealAddressByIP("127.0.0.1"));
Console.log("183.82.118.0",AddressUtils.getRealAddressByIP("183.82.118.0"));
return "ok";
}
}
打印结果:
空 XX XX
127.0.0.1 内网IP
183.82.118.0 印度|安德拉|海得拉巴|ACT