专栏名称: 程序员鱼皮
鹅厂全栈开发,持续分享编程技法和实用项目
目录
相关文章推荐
杭州交通918  ·  爆发了!阿里巴巴突传消息 ·  昨天  
FM93交通之声  ·  谢娜发文报平安 ·  2 天前  
钱江晚报  ·  大S妈妈首度发文,回应女儿去世 ·  2 天前  
钱江晚报  ·  突发!林孝埈退赛 ·  2 天前  
51好读  ›  专栏  ›  程序员鱼皮

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

程序员鱼皮  · 公众号  ·  · 2024-04-23 18:01

正文

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

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

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

/**
 * 网络工具类
 *
 * @author 程序员鱼皮
 * @from 编程导航知识星球
 */

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 页面,是真的炫酷~







请到「今天看啥」查看全文


推荐文章
杭州交通918  ·  爆发了!阿里巴巴突传消息
昨天
FM93交通之声  ·  谢娜发文报平安
2 天前
钱江晚报  ·  大S妈妈首度发文,回应女儿去世
2 天前
钱江晚报  ·  突发!林孝埈退赛
2 天前