ITPub博客

首页 > 数据库 > 数据库开发技术 > 今日代码大赏 | Java 获取客户端 IP 地址

今日代码大赏 | Java 获取客户端 IP 地址

原创 数据库开发技术 作者:程序员鱼皮 时间:2024-04-23 18:01:41 0 删除 编辑

在如今的程序开发中,获取客户端的 IP 地址已成为不可或缺的一环。它不仅能够帮助我们精准追踪用户行为,分析流量来源,还能在出现问题时快速定位到错误的发生者。

今天,我们分享一个用 Java 编写的客户端 IP 地址获取工具类,示例代码如下:

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;

/**
 * 网络工具类
 *
 * @author <a href="https://github.com/liyupi">程序员鱼皮</a>
 * @from <a href="https://yupi.icu">编程导航知识星球</a>
 */

public class NetUtils {

    /**
     * 获取客户端 IP 地址
     *
     * @param request 请求
     * @return {@link String}
     */

    public static String getIpAddress(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
            if ("127.0.0.1".equals(ip)) {
                // 根据网卡取本机配置的 IP
                InetAddress inet = null;
                try {
                    inet = InetAddress.getLocalHost();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (inet != null) {
                    ip = inet.getHostAddress();
                }
            }
        }
        // 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
        if (ip != null && ip.length() > 15) {
            if (ip.indexOf(",") > 0) {
                ip = ip.substring(0, ip.indexOf(","));
            }
        }
        if (ip == null) {
            return "127.0.0.1";
        }
        return ip;
    }

}

在这个例子中,我们首先尝试从请求头中获取 x-forwarded-for,这是代理服务器标准字段,用于表示原始请求的来源 IP 地址。如果这个字段不存在或者为未知,我们继续尝试获取其他可能的代理 IP 地址字段。如果所有代理 IP 地址字段都不存在或未知,我们最后尝试获取请求的远程地址,即客户端 IP 地址。

如果远程地址是本地回环地址(127.0.0.1),我们尝试获取本机的 IP 地址。在获取 IP 地址的过程中,我们还需要处理可能存在的多个代理 IP 地址的情况,只保留第一个 IP 地址作为客户端的真实 IP。

今天的代码大赏就到这里。希望通过这篇文章,你能够对如何利用 Java 获取客户端 IP 地址的工具类有一个更深入的理解。如果你对 Java 工具类感兴趣,或者想要了解更多不同场景下的工具类实现,欢迎在评论区留下自己的想法和建议。

完整代码片段来源于代码小抄,欢迎点击进入小程序阅读!

在线访问:https://www.codecopy.cn/post/7ytalw

在代码小抄可以看到更多优质代码,也欢迎大家积极分享,可能会获得我们官方的小礼品 🎁~

往期推荐

专属程序员的浪漫:用代码说 “我爱你”~

这个 404 页面,是真的炫酷~

我成功复刻了安卓 6 的彩蛋!

今日代码大赏 | 本地文件存储

今日代码大赏 | 统一异常处理类

原文作者:程序员鱼皮;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-12-20

  • 博文量
    330
  • 访问量
    151689