杰瑞科技汇

Java如何获取服务器真实IP地址?

在Java中获取服务器IP地址

在Java中获取服务器IP地址有几种不同的方法,具体取决于你的需求(是获取本机IP还是远程服务器IP)以及运行环境(是客户端应用还是服务器端应用)。

Java如何获取服务器真实IP地址?-图1
(图片来源网络,侵删)

获取本机IP地址

获取本机所有网络接口的IP地址

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class GetLocalIP {
    public static void main(String[] args) {
        try {
            // 获取所有网络接口
            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = networkInterfaces.nextElement();
                // 获取网络接口的IP地址
                Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
                while (inetAddresses.hasMoreElements()) {
                    InetAddress inetAddress = inetAddresses.nextElement();
                    // 过滤掉回环地址和IPv6地址(如果只需要IPv4)
                    if (!inetAddress.isLoopbackAddress() && !inetAddress.getHostAddress().contains(":")) {
                        System.out.println("Interface: " + networkInterface.getName());
                        System.out.println("Display Name: " + networkInterface.getDisplayName());
                        System.out.println("IP Address: " + inetAddress.getHostAddress());
                        System.out.println("Host Name: " + inetAddress.getHostName());
                        System.out.println("Canonical Host Name: " + inetAddress.getCanonicalHostName());
                        System.out.println("---------------------");
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
}

获取本机主机名和默认IP地址

import java.net.InetAddress;
public class GetLocalHostName {
    public static void main(String[] args) {
        try {
            // 获取本地主机名
            String hostName = InetAddress.getLocalHost().getHostName();
            System.out.println("Host Name: " + hostName);
            // 获取本地IP地址
            String ipAddress = InetAddress.getLocalHost().getHostAddress();
            System.out.println("IP Address: " + ipAddress);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

获取远程服务器IP地址

通过主机名获取远程服务器IP

import java.net.InetAddress;
public class GetRemoteIP {
    public static void main(String[] args) {
        try {
            // 通过主机名获取IP地址
            InetAddress[] addresses = InetAddress.getAllByName("www.example.com");
            for (InetAddress address : addresses) {
                System.out.println("Host: " + address.getHostName());
                System.out.println("IP Address: " + address.getHostAddress());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

通过URL获取远程服务器IP

import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
public class GetServerIPFromURL {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://www.example.com");
            String host = url.getHost();
            InetAddress[] addresses = InetAddress.getAllByName(host);
            for (InetAddress address : addresses) {
                System.out.println("Host: " + host);
                System.out.println("IP Address: " + address.getHostAddress());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在Web应用中获取客户端IP地址

如果你是在Servlet或Spring Boot等Web框架中,获取客户端IP地址的方法如下:

Servlet中获取客户端IP

import javax.servlet.http.HttpServletRequest;
public class ClientIP {
    public static 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();
        }
        // 对于多个IP的情况(如X-Forwarded-For: client, proxy1, proxy2),取第一个
        if (ip != null && ip.contains(",")) {
            ip = ip.split(",")[0].trim();
        }
        return ip;
    }
}

Spring Boot中获取客户端IP

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class IPController {
    @GetMapping("/ip")
    public String getClientIp(HttpServletRequest request) {
        String ip = request.getRemoteAddr();
        // 如果使用了代理服务器,可能需要从特定header获取
        if (request.getHeader("X-Forwarded-For") != null) {
            ip = request.getHeader("X-Forwarded-For").split(",")[0].trim();
        } else if (request.getHeader("Proxy-Client-IP") != null) {
            ip = request.getHeader("Proxy-Client-IP");
        } else if (request.getHeader("WL-Proxy-Client-IP") != null) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        return "Client IP: " + ip;
    }
}

注意事项

  1. IPv6和IPv4:上面的代码中有些部分过滤掉了IPv6地址,如果需要支持IPv6,请移除相关过滤条件。

  2. 代理服务器:当应用部署在反向代理(如Nginx、Apache)后面时,直接获取的可能是代理服务器的IP,需要从特定HTTP头(如X-Forwarded-For)获取真实客户端IP。

  3. 网络接口:服务器可能有多个网络接口,每个接口可能有不同的IP地址,需要根据实际需求选择合适的IP。

    Java如何获取服务器真实IP地址?-图2
    (图片来源网络,侵删)
  4. 权限:某些网络接口可能需要特殊权限才能访问。

  5. 容器化环境:在Docker等容器化环境中,获取IP的方式可能需要特殊处理。

Java如何获取服务器真实IP地址?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇