在Java开发中,获取IP地址是一项常见的需求,无论是用于用户定位、安全认证还是系统日志记录,本文将详细介绍Java获取IP地址的多种方法,包括获取客户端IP、服务器IP以及处理代理环境下的真实IP,并附上代码示例和注意事项。

获取客户端IP地址
在Web应用中,客户端IP地址通常通过HTTP请求的HttpServletRequest对象获取,最直接的方法是调用request.getRemoteAddr(),该方法返回发出请求的客户端IP地址,在实际应用中,当客户端通过代理服务器(如Nginx、Apache)访问时,getRemoteAddr()返回的可能是代理服务器的IP而非真实客户端IP,需要通过解析请求头中的X-Forwarded-For或X-Real-IP等字段来获取真实IP。
以下是获取客户端真实IP的代码示例:
public String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
注意事项:
X-Forwarded-For可能包含多个IP,第一个IP为真实客户端IP,后续为代理链IP。- 需注意代理服务器是否添加了这些请求头,部分代理可能不会传递
X-Real-IP。 - 在开发环境中(如本地Tomcat),直接调用
getRemoteAddr()即可获取真实IP。
获取服务器本机IP地址
在服务器端应用中,有时需要获取本机IP地址,例如服务注册、网络通信等场景,Java提供了InetAddress类来获取本地IP地址,以下是常用方法:

获取本机主机名和IP
import java.net.InetAddress;
import java.net.UnknownHostException;
public class LocalIpExample {
public static void main(String[] args) {
try {
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("主机名: " + localHost.getHostName());
System.out.println("IP地址: " + localHost.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
// 输出示例:
// 主机名: DESKTOP-ABC123
// IP地址: 192.168.1.100
// 注意:可能返回IPv6地址(如fe80:0:0:0:0:0:0:1%1),需根据需求过滤
}
}
获取所有本机IP地址
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class GetAllLocalIps {
public static void main(String[] args) {
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
System.out.println("网卡名称: " + networkInterface.getName() +
", IP地址: " + inetAddress.getHostAddress());
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
注意事项:
InetAddress.getLocalHost()可能返回IPv6地址,需通过inetAddress instanceof Inet4Address判断是否为IPv4。- 在虚拟机或Docker环境中,获取的IP可能是容器/虚拟机的内网IP,需结合网络配置获取公网IP。
- 避免在循环中频繁调用
getNetworkInterfaces(),建议缓存结果。
处理代理环境下的真实IP
当应用部署在反向代理(如Nginx)后端时,需配置代理传递真实客户端IP,以Nginx为例,配置如下:
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend_server;
}
在Java代码中,需按优先级解析请求头:
- X-Forwarded-For:格式为
client1, proxy1, proxy2,取第一个非unknown的IP。 - X-Real-IP:部分代理(如Nginx)会设置此字段。
- Proxy-Client-IP:WebLogic等代理服务器可能使用。
- WL-Proxy-Client-IP:WebLogic的专用字段。
优化后的代码:

public String getRealIp(HttpServletRequest request) {
String[] headers = {"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP"};
for (String header : headers) {
String ip = request.getHeader(header);
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
// 处理X-Forwarded-For中的多个IP
if (header.equals("X-Forwarded-For")) {
ip = ip.split(",")[0].trim();
}
return ip;
}
}
return request.getRemoteAddr();
}
IP地址验证与处理
获取IP地址后,常需进行有效性验证或格式转换,以下是常见操作:
验证IPv4地址格式
import java.util.regex.Pattern;
public static boolean isValidIPv4(String ip) {
String regex = "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$";
return Pattern.matches(regex, ip);
}
将IP地址转换为Long类型
public static long ipToLong(String ip) {
String[] parts = ip.split("\\.");
long result = 0;
for (int i = 0; i < 4; i++) {
result = result << 8 | Long.parseLong(parts[i]);
}
return result;
}
Java获取IP地址的方法需根据应用场景选择:
- 客户端IP:优先解析
X-Forwarded-For等代理头,最终回退到getRemoteAddr()。 - 服务器IP:通过
InetAddress获取本机IP,注意过滤回环地址和链路本地地址。 - 代理环境:需配置代理服务器传递真实IP,并在代码中正确解析请求头。
实际开发中还需考虑IPv6兼容、IP白名单验证、异常处理等细节,确保IP地址获取的准确性和安全性。
















