- 服务端提供获取终端外网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
的完整写法,代表本机地址。
- 可以使用在服务器上部署的接口验证,如:http://www.xdr630.com:8090/getRemoteIp
