AddressUtils类提供了一个静态方法getRealAddressByIP,用于根据IP地址查询真实的物理地址。它通过发送HTTP请求到指定的URL,并解析返回的JSON数据来获取地址信息。
-
常量定义:
- IP_URL:用于查询IP地址的URL,值为"http://whois.pconline.com.cn/ipJson.jsp"。
- UNKNOWN:表示未知地址,值为"XX XX"。
-
方法getRealAddressByIP用于根据IP地址获取真实的物理地址。它接收一个字符串类型的IP地址作为参数,并返回一个字符串类型的物理地址。
首先,判断传入的IP地址是否为内网IP地址,如果是,则返回"内网IP"。
接着,判断配置文件中是否启用了地址查询功能(MuyuanConfig.isAddressEnabled())。
如果启用了地址查询功能,则使用HttpUtils.sendGet()方法发送GET请求,将IP地址作为参数附加在URL后面,并设置字符编码为Constants.GBK(GBK编码)。
如果返回的响应字符串为空,则记录错误日志并返回UNKNOWN。
否则,使用fastjson库解析响应字符串为JSONObject对象,并从中获取省份("pro"字段)和城市("city"字段)信息。
最后,使用String.format()方法将省份和城市信息格式化为"省份 城市"的形式,并作为真实的物理地址返回。
package com.muyuan.common.utils.ip; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSONObject; import com.muyuan.common.config.MuyuanConfig; import com.muyuan.common.constant.Constants; import com.muyuan.common.utils.StringUtils; import com.muyuan.common.utils.http.HttpUtils; /** * 获取地址类 * * */ public class AddressUtils { private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); // IP地址查询 public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; // 未知地址 public static final String UNKNOWN = "XX XX"; public static String getRealAddressByIP(String ip) { String address = UNKNOWN; // 内网不查询 //详见文章IP查询 if (IpUtils.internalIp(ip)) { return "内网IP"; } if (MuyuanConfig.isAddressEnabled()) { try { String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); if (StringUtils.isEmpty(rspStr)) { log.error("获取地理位置异常 {}", ip); return UNKNOWN; } JSONObject obj = JSONObject.parseObject(rspStr); String region = obj.getString("pro"); String city = obj.getString("city"); return String.format("%s %s", region, city); } catch (Exception e) { log.error("获取地理位置异常 {}", ip); } } return address; } }