JAVA代码优化:地址工具类(根据IP地址获取真实的物理地址)

AddressUtils类提供了一个静态方法getRealAddressByIP,用于根据IP地址查询真实的物理地址。它通过发送HTTP请求到指定的URL,并解析返回的JSON数据来获取地址信息。 

  1. 常量定义:

  2. 方法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;
        }
    }
    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公隐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值