您的位置:

Java获取客户端IP的方法

一、通过HttpServletRequest获取

在Java Web开发中,获取客户端IP地址的最常用方法是通过HttpServletRequest对象获取,示例代码如下:

public String getIpAddress(HttpServletRequest request) {
    String ipAddress = request.getHeader("x-forwarded-for");
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("Proxy-Client-IP");
    }
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getRemoteAddr();
    }
    return ipAddress;
}

这段代码中,首先尝试从x-forwarded-forProxy-Client-IPWL-Proxy-Client-IP这三个HTTP头中获取客户端IP地址,如果这三个头都没有获取到,则通过request.getRemoteAddr()获取客户端IP地址。

二、通过反向代理获取

在一些情况下,Web应用可能会被反向代理服务器挡在后面,此时,客户端的请求不会直接传递到Web应用,而是先传递到反向代理服务器。如果此时仍然使用第一种方法获取客户端IP,可能会得到反向代理服务器的IP地址,而不是客户端的IP地址。

这种情况下,可以在反向代理服务器中设置相关的HTTP头,告诉Web应用客户端的真实IP地址,示例代码如下:

location / {
    proxy_pass http://example.com;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

在这段代码中,X-Real-IPX-Forwarded-For这两个HTTP头都会被设置,其中X-Real-IP头会被设置为客户端的真实IP地址,X-Forwarded-For头则会被设置为一个由逗号分隔的IP地址列表,其中第一个IP地址是客户端的IP地址。

三、通过Socket获取

如果Web应用需要处理非HTTP的协议,例如SMTP、POP3等,那么就需要通过Socket获取客户端IP地址。

示例代码如下:

Socket socket = new Socket("localhost", 80);
String ipAddress = socket.getInetAddress().getHostAddress();

这段代码中,通过Socket连接到指定的服务器和端口,然后通过socket.getInetAddress()获取连接的对端IP地址。