java獲取IP和IP的歸屬地的方法實踐
在Java中,獲取IP地址通常指的是獲取本地機器的IP地址或者通過某種方式(如HTTP請求)獲取的遠程IP地址。代碼案例如下:


而要獲取IP的歸屬地(地理位置信息),則通常需要使用第三方IP地址查詢服務(wù),我這里使用的是 ip2region開源IP庫。代碼操作步驟如下:
1.導入ip2region庫:

2.在pom文件中包含該目錄下的對應(yīng)資源

3.根據(jù)IP獲取歸屬地
public static String getAddressLog(String userPhone, String ip) {
try {
HttpServletRequest request = RequestUtil.getRequest();
log.info("======> 獲取客戶端IP地址:clientIP:{}", ip);
if (StrUtil.isBlank(ip)) {
log.error("獲取用戶ip失敗,用戶手機號 = " + userPhone);
} else {
IpLocation ipLocation = IPUtil.getLocation(ip);
if (ObjectUtil.isNotNull(ipLocation.getProvince())) {
//根據(jù)業(yè)務(wù)需求來確定需要定位到省還是省-市,我這里就直接是定位到省
String address = ipLocation.getProvince();
log.info("======> IP解析后的地址信息:{}", address);
//注意:如果是內(nèi)網(wǎng)IP的話,這里將查詢不到歸屬地,而會返回內(nèi)網(wǎng),
//這里如果是內(nèi)網(wǎng)IP就直接處理變成廣東省。
if (StringUtils.isNotEmpty(address)){
return address.contains("內(nèi)網(wǎng)") ? "廣東省" : address;
}
}
}
} catch (Exception e) {
log.error("通過ip獲取用戶位置失敗,用戶phone = {}", userPhone);
log.error("通過ip獲取用戶位置失敗,e = {}", e);
}
}
/**
* 根據(jù)iP獲取歸屬地信息
*/
public static IpLocation getLocation(String ip) {
IpLocation location = new IpLocation();
location.setIp(ip);
try (InputStream inputStream = IPUtil.class.getResourceAsStream("/ipdb/ip2region.xdb");) {
byte[] bytes = IoUtil.readBytes(inputStream);
Searcher searcher = Searcher.newWithBuffer(bytes);
String region = searcher.search(ip);
log.info("============> region:{}", region);
if (StrUtil.isNotBlank(region)) {
// xdb返回格式 國家|區(qū)域|省份|城市|ISP,
// 只有中國的數(shù)據(jù)絕大部分精確到了城市,其他國家部分數(shù)據(jù)只能定位到國家,后前的選項全部是0
String[] result = region.split("\\|");
location.setCountry(ZERO.equals(result[0]) ? StrUtil.EMPTY : result[0]);
location.setProvince(ZERO.equals(result[2]) ? StrUtil.EMPTY : result[2]);
location.setCity(ZERO.equals(result[3]) ? StrUtil.EMPTY : result[3]);
location.setIsp(ZERO.equals(result[4]) ? StrUtil.EMPTY : result[4]);
}
searcher.close();
} catch (Exception e) {
e.printStackTrace();
return location;
}
return location;
}4.結(jié)果展示

到此這篇關(guān)于java獲取IP和IP的歸屬地的方法實踐的文章就介紹到這了,更多相關(guān)java獲取IP和IP的歸屬地內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis創(chuàng)建項目報Invalid?bound?statement?(not?found)錯誤解決方法
使用MyBatis能夠幫助我們將SQL語句和Java代碼分離,這篇文章主要給大家介紹了關(guān)于mybatis創(chuàng)建項目報Invalid?bound?statement?(not?found)錯誤的解決方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05
Java遍歷字符串和統(tǒng)計字符個數(shù)的操作方法
這篇文章主要介紹了Java遍歷字符串和統(tǒng)計字符個數(shù)的操作方法,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-12-12
SpringBoot使用prometheus監(jiān)控的示例代碼
這篇文章主要介紹了SpringBoot使用prometheus監(jiān)控的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
Spring?boot2.0?實現(xiàn)日志集成的方法(3)
這篇文章主要介紹了Spring?boot2.0?實現(xiàn)日志集成的方法,基于上一篇將日志信息根據(jù)類別輸出到不同的文件中,這篇文章將通過日志來監(jiān)控用戶的操作行為、請求的耗時情況,針對耗時久的請求進行性能分析,提升系統(tǒng)性能,需要的小伙伴可以參考一下2022-04-04
Java for循環(huán)常見優(yōu)化方法案例詳解
這篇文章主要介紹了Java for循環(huán)常見優(yōu)化方法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08

