在Java中,獲取IP地址通常指的是獲取本地機器的IP地址或者通過某種方式(如HTTP請求)獲取的遠程IP地址。代碼案例如下:
而要獲取IP的歸屬地(地理位置信息),則通常需要使用第三方IP地址查詢服務,我這里使用的是?ip2region開源IP庫。代碼操作步驟如下:
1.導入ip2region庫:
2.在pom文件中包含該目錄下的對應資源?
3.根據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())) {//根據業務需求來確定需要定位到省還是省-市,我這里就直接是定位到省String address = ipLocation.getProvince();log.info("======> IP解析后的地址信息:{}", address);//注意:如果是內網IP的話,這里將查詢不到歸屬地,而會返回內網,//這里如果是內網IP就直接處理變成廣東省。if (StringUtils.isNotEmpty(address)){return address.contains("內網") ? "廣東省" : address;}}}} catch (Exception e) {log.error("通過ip獲取用戶位置失敗,用戶phone = {}", userPhone);log.error("通過ip獲取用戶位置失敗,e = {}", e);}
}/*** 根據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返回格式 國家|區域|省份|城市|ISP,// 只有中國的數據絕大部分精確到了城市,其他國家部分數據只能定位到國家,后前的選項全部是0String[] 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.結果展示