最近有个需求是通过ip地址获取地址详情,没有弄过相关的接口,通过查资料搞定之后赶紧记录分享一下
一开始我是通过api的方法获取但是总是报错获取不到所以改用了ip2region离线ip解析的方法获取的,废话不多说看操作。
首先要下载ip2region.db
下载地址:百度网盘 请输入提取码
提取码:vik5
配置依赖
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
将文件放到resources目录下
配置一个工具类(里面有个测试方法)
之前我在网上查的资料用完之后本地是可以的测试的但是部署到服务器之后就找不到ip2region.db这个文件了,因为这个文件我是放在resources目录 下面的,大家都知道打包之后resources这个目录 是不存在的所以找不到这个文件,后来试了很久才搞定,下面是优化的工具类
@Slf4j
public class IpUtil {
/**
* 获取IP地址
* @param request
* @return
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if ("0:0:0:0:0:0:0:1".equals(ip)) {
ip = "127.0.0.1";
}
if (ip.split(",").length > 1) {
ip = ip.split(",")[0];
}
return ip;
}
/**
* 根据IP地址获取城市
* @param ip
* @return
*/
public static String getCityInfo(String ip) throws IOException {
// 这里能读到这个流,但是是找不到这个文件的
ClassPathResource classPathResource = new ClassPathResource("ip2region.db");
// 我们新建一个文件,把流存放到这个文件,再从这个文件里面读取数据,就可以了
File file = new File("ip2region.db");
FileUtils.copyInputStreamToFile(classPathResource.getInputStream(),file);
// todo 获取输入流
InputStream inputStream = new FileInputStream(file);
try {
int len;
byte[] buffer = new byte[1024];
//todo 这里的输出记得删除再上线
while ((len = inputStream.read(buffer)) != -1) {
// System.out.println(new String(buffer, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
// TODO 记得关闭流操作
inputStream.close();
}
//查询算法
int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree
try {
DbConfig config = new DbConfig();
DbSearcher searcher = new DbSearcher(config,file.getPath());
Method method;
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;
default:
return null;
}
DataBlock dataBlock;
if (!Util.isIpAddress(ip)) {
log.info("Error: Invalid ip address");
return null;
}
dataBlock = (DataBlock) method.invoke(searcher, ip);
return dataBlock.getRegion();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
try {
// 这个ip的结果是 中国|0|香港|0|香港宽频
String detail = IpUtil.getCityInfo("58.176.81.30");
System.out.println(detail);
}catch (IOException e){
}
}
}
到这里就完事了。
这下面是一下国外的ip地址可以测试一下
'35.187.132.16',
'35.187.132.18',
'49.35.162.6',
'5.188.210.227',
'64.233.173.10',
'74.125.151.127',
'74.125.212.219',
'74.125.212.221',
'95.184.60.224'
到此这篇关于Java利用ip2region实现获取IP地址详情的文章就介绍到这了,更多相关Java ip2region获取IP地址内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!