package com.qxueyou.scc.config;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.lang3.StringUtils;
|
import org.lionsoul.ip2region.DataBlock;
|
import org.lionsoul.ip2region.DbConfig;
|
import org.lionsoul.ip2region.DbSearcher;
|
import org.lionsoul.ip2region.Util;
|
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.io.File;
|
import java.io.InputStream;
|
|
/**
|
* @author: liuliu
|
* @date: 2023/07/03 10:28
|
* @description: ip工具类
|
*/
|
@Slf4j
|
public class IpUtils {
|
|
/**
|
* 本地环回地址
|
*/
|
private static final String LOCAL_IP = "127.0.0.1";
|
|
/**
|
* 未知
|
*/
|
private static final String UNKNOWN = "unknown";
|
|
public static String getIpAddr(HttpServletRequest request) {
|
|
if (request == null) {
|
return UNKNOWN;
|
}
|
|
String ip = request.getHeader("x-forwarded-for");
|
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
|
ip = request.getHeader("Proxy-Client-IP");
|
}
|
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
|
ip = request.getHeader("X-Forwarded-For");
|
}
|
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
|
ip = request.getHeader("WL-Proxy-Client-IP");
|
}
|
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
|
ip = request.getHeader("X-Real-IP");
|
}
|
|
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
|
ip = request.getRemoteAddr();
|
}
|
|
return "0:0:0:0:0:0:0:1".equals(ip) ? LOCAL_IP : ip;
|
}
|
|
public static String getCityInfo(String ip) throws Exception {
|
|
if (!Util.isIpAddress(ip)) {
|
log.error("错误: 无效的ip地址");
|
return null;
|
}
|
|
InputStream is = new PathMatchingResourcePatternResolver().getResources("ip2region.db")[0].getInputStream();
|
File target = new File("ip2region.db");
|
FileUtils.copyInputStreamToFile(is, target);
|
is.close();
|
|
if (StringUtils.isEmpty(String.valueOf(target))) {
|
log.error("错误: 无效的ip2region.db文件");
|
return null;
|
}
|
|
DbSearcher searcher = new DbSearcher(new DbConfig(), String.valueOf(target));
|
|
try {
|
DataBlock dataBlock = (DataBlock) searcher.getClass().getMethod("btreeSearch", String.class).invoke(searcher, ip);
|
|
String ipInfo = dataBlock.getRegion();
|
if (!StringUtils.isEmpty(ipInfo)) {
|
ipInfo = ipInfo.replace("|0", "");
|
ipInfo = ipInfo.replace("0|", "");
|
}
|
|
return ipInfo;
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
}
|