获取终端外网IP地址

  • 服务端提供获取终端外网IP地址的IP,http接口的形式
  • 以下只提供获取到 IPV4 的地址
  • 把以下接口部署到服务器中,客户端请求访问服务端时获取到当前客户端的外网IP地址
  • 如果部署到本地,访问时返回的为 null
java 复制代码
/**
 * ClientIpController
 *
 * @author xdr630
 * @since 2025/7/6
 */
@RestController
public class ClientIpController {

    private static final Logger LOGGER = LoggerFactory.getLogger(ClientIpController .class);

    @GetMapping("/getRemoteIp")
    @ResponseBody
    public String getClientIp(HttpServletRequest request) {

        String clientIp = null;

        try {
            String xForwardedFor = request.getHeader("X-Forwarded-For");
            if (xForwardedFor != null && !xForwardedFor.isEmpty() && !"unknown".equalsIgnoreCase(xForwardedFor)) {
                // X-Forwarded-For:Squid 服务代理,X-Forwarded-For 可能包含多个 IP,取第一个非空的 IP
                clientIp = xForwardedFor.split(",")[0].trim();
            }

            if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {
                // Proxy-Client-IP:apache 服务代理
                clientIp = request.getHeader("Proxy-Client-IP");
            }

            if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {
                // WL-Proxy-Client-IP:weblogic 服务代理
                clientIp = request.getHeader("WL-Proxy-Client-IP");
            }

            if ((clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp))) {
                // X-Real-IP:nginx服务代理
                clientIp = request.getHeader("X-Real-IP");
            }

            if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {
                clientIp = request.getRemoteAddr();
            }

            if (clientIp != null && !clientIp.isEmpty()) {
                clientIp = clientIp.split(",")[0];
            }

            if (!isValidIPv4(clientIp)) {
                LOGGER.warn("无效的客户端 IP: {}", clientIp);
                // 在浏览器端显示返回null
                clientIp = "null";
            }
        } catch (Exception e) {
            LOGGER.error("获取客户端公网IP失败", e);
            throw new RuntimeException(e);
        }

        return clientIp;
    }

    private boolean isValidIPv4(String ip) {
        String ipv4Regex = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
        return Pattern.compile(ipv4Regex).matcher(ip).matches();
    }
}
  • clientIp = "null"; 如果去掉这段的话,当本地访问这个接口时,返回的地址就会为如下,这里改为字符串null更好点

IPv6 地址 0:0:0:0:0:0:0:1 是一个特殊的保留地址,它等价于 IPv4 中的 127.0.0.1。这个地址表示本机回环地址(Loopback Address)

含义:

  • IPv6 回环地址::1
    • 这个地址通常被简写为 ::1,而不是写全八个段 0:0:0:0:0:0:0:1
    • 它用于代表本机(localhost),也就是说,当你在一台设备上使用这个地址时,网络通信不会通过物理网络接口,而是直接返回到本机。

用途:

  • 测试本地网络应用(如 Web 服务器、数据库等)。
  • 配置服务监听时,绑定到 ::1 表示只接受本机的连接请求。
  • 开发和调试网络程序时非常有用。

类比:

地址类型 地址 说明
IPv4 127.0.0.1 本机回环地址
IPv6 ::1 IPv6 的本机回环地址

看到的 0:0:0:0:0:0:0:1 就是 ::1 的完整写法,代表本机地址。

相关推荐
埃科光电7 小时前
16K万兆网口彩色线阵相机:四倍带宽 高速真彩检测新方案
网络·图像处理·数码相机·计算机视觉·制造·相机
用户094248568038 小时前
第3章:OpenJDK从源码到字节码——Class 文件与 javac 管线
java·jvm
azhou的代码园8 小时前
基于RFM模型的中小型企业客户管理系统
java·人工智能·spring boot·毕业设计
君顾18 小时前
酒吧点餐小程序系统开发实战:从架构设计到上线全流程指南
java·开发语言·酒吧
子非鱼a8 小时前
【WEB】[SWPU2019]Web1
java·服务器·前端
花生了什么事o8 小时前
自定义Spring Boot Starter全流程
java·spring boot·后端
运维全栈笔记8 小时前
Windows 安装 WSL2 并运行 Ubuntu 24.04 指南
linux·网络·windows·ubuntu
qq_452396239 小时前
第十篇:《eBPF 可观测性:零侵扰的深度内核追踪》
服务器·网络·php
迪康Defender9 小时前
政企内网终端安全建设:资产‑管控‑防护‑审计闭环能力拆解
运维·网络·安全·web安全·终端安全管理
晓天衡宇•评测社区9 小时前
Seedance 2.5 登顶图生视频榜单,Wan 3.0 在游戏与教育场景进入前列
前端·javascript·网络