Springboot项目整合ip2region获取IpAddress详细信息
物料准备:
- ip2region的xml依赖信息
- ip2region.xdb数据库文件(ip库文件,可以在guthub的ip2region项目主页下载)
- 写一个Ip2regionUtil的工具类
引入获取ip及ip地址详情的相关依赖到pom.xml
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<!-- 提供了操作ip2region.xdb文件的方法 -->
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<!-- 提供了多种工具类,这里引入hutool是为了获取request中的ip地址-->
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>
将ip2region.xdb文件放到resources/xdb目录下
定义Ip2regionUtil.java工具类
import cn.hutool.extra.servlet.ServletUtil;
import lombok.extern.slf4j.Slf4j;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.util.ResourceUtils;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
@Slf4j
public class Ip2regionUtil {
/**
* 从HttpServletRequest中获取浏览器客户端的请求ip
* @param request HttpServletRequest
* @return String ip地址
*/
public static String getIp(HttpServletRequest request){
String clientIP = ServletUtil.getClientIP(request);
String ip = "0:0:0:0:0:0:0:1".equals(clientIP) ? "127.0.0.1" : clientIP;
ip = ip.trim();
log.info("请求ip:{}", ip);
return ip;
}
/**
* 根据ip地址查询IP所属的实际地址信息
* @param ip String ip地址,如 223.120.23.106
* @return String xx省xx市xx区移动/联通/电信
* @throws Exception
*/
public static String getAddr(String ip) throws Exception{
File file = ResourceUtils.getFile("classpath:xdb/ip2region.xdb");
byte[] cBuff = Searcher.loadContentFromFile(file.getPath());
Searcher searcher = Searcher.newWithBuffer(cBuff);
String region = searcher.searchByStr(ip);
String addr = region.replace("0|", "").replace("|0", "");
log.info("请求addr:{}", addr);
searcher.close();
return addr;
}
}
测试使用效果
2023-06-02 10:00:41,213 INFO [http-nio-8080-exec-5] [18e7c92c-ab87-4c5e-82bb-a5f1008f084c] c.a.k.u.Ip2regionUtil [Ip2regionUtil.java : 20] 请求ip:127.0.0.1
2023-06-02 10:00:41,356 INFO [http-nio-8080-exec-5] [18e7c92c-ab87-4c5e-82bb-a5f1008f084c] c.a.k.u.Ip2regionUtil [Ip2regionUtil.java : 30] 请求addr:内网IP|内网IP
2023-06-02 10:03:39,670 INFO [http-nio-8080-exec-1] [e4932db5-387f-458e-b385-08389b967d39] c.a.k.u.Ip2regionUtil [Ip2regionUtil.java : 20] 请求ip:10.1.5.212
2023-06-02 10:03:39,680 INFO [http-nio-8080-exec-1] [e4932db5-387f-458e-b385-08389b967d39] c.a.k.u.Ip2regionUtil [Ip2regionUtil.java : 30] 请求addr:内网IP|内网IP
===============================================
linux测试,遇到问题,找不到xdb文件;
解决方法如下:
1.jar包指定resource子文件打包:
需要在pom.xml里的build标签里设置resources资源打包配置
2.设置代码从ClassPathResource里读取xdb文件
/**
* 根据ip地址查询IP所属的实际地址信息
* @param ip String ip地址,如 223.120.23.106
* @return String xx省xx市xx区移动/联通/电信
* @throws Exception
*/
public static String getAddr(String ip) throws Exception{
ClassPathResource resource = new ClassPathResource("\\xdb\\ip2region.xdb");
// String canonicalPath = resource.getFile().getCanonicalPath();
// log.info("canonicalPath:{}",canonicalPath);
// File file = resource.getFile();
// byte[] cBuff = Searcher.loadContentFromFile(file.getPath());
byte[] cBuff = FileCopyUtils.copyToByteArray(resource.getInputStream());
Searcher searcher = Searcher.newWithBuffer(cBuff);
String region = searcher.searchByStr(ip);
String addr = region.replace("0|", "").replace("|0", "");
log.info("请求addr:{}", addr);
searcher.close();
return addr;
}