如何在Java HttpServletRequest中获取客户端IP地址

40

我正在尝试开发一个Java Web应用程序(Servlet),需要获取客户端的IP地址。

以下是我到目前为止的代码:

String ipAddress =  request.getRemoteAddr();

在这种情况下,大多数时候我得到的是“默认网关地址”(147.120.1.5),而不是我的机器IP地址(174.120.100.17)。

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
    ipAddress = request.getRemoteAddr();  
} 

在这种情况下,大多数时候我得到的是“默认网关地址”(147.120.1.5),而不是我的机器IP地址(174.120.100.17)。

InetAddress IP=InetAddress.getLocalHost();
System.out.println(IP.getHostAddress());

在这种情况下,我获得了服务器IP地址(147.120.20.1)。

我的IP地址是147.120.100.17。现在我不知道如何获取真实的客户端IP地址。

非常感谢。


除非客户端明确地将其发送给您,否则没有准确的方法获取客户端IP地址。 - Scary Wombat
1
无法获取客户端的真实IP地址,您实际看到的是您的公共IP地址。 - Rod_Algonquin
这意味着Web应用程序无法准确确定客户端IP地址吗? - Samith Dilshan
3
最后一个选项是错误的。它返回您服务器的IP地址。您认为它是正确的,因为在开发环境中,您的服务器和测试浏览器的位置是相同的。 - ramp
4个回答

90

6
当我使用上述代码时,得到的是“localhost”而不是我的IP地址。 - Rama Krishna
38
X-FORWARD-FOR头部在这里有一定的风险。因为如果您使用反向代理进行请求,此头部值将会是这样的:231.23.45.65, 10.20.10.33, 10.20.20.34(这意味着客户端IP、负载均衡器服务器和反向代理服务器)。请检查您的X-FORWARD-FOR头部值是否包含“,”。 使用ipAddress.contains(“,”)?ipAddress.split(“,”)[0]:ipAddress来提取客户端IP地址。 - utkusonmez
同意。2023年3月的合理参考资料在这里:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For - Scott Corscadden

33

试试这个。适用于所有情况。

private static final String[] HEADERS_TO_TRY = {
            "X-Forwarded-For",
            "Proxy-Client-IP",
            "WL-Proxy-Client-IP",
            "HTTP_X_FORWARDED_FOR",
            "HTTP_X_FORWARDED",
            "HTTP_X_CLUSTER_CLIENT_IP",
            "HTTP_CLIENT_IP",
            "HTTP_FORWARDED_FOR",
            "HTTP_FORWARDED",
            "HTTP_VIA",
            "REMOTE_ADDR" };

private String getClientIpAddress(HttpServletRequest request) {
    for (String header : HEADERS_TO_TRY) {
        String ip = request.getHeader(header);
        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
            return ip;
        }
    }

    return request.getRemoteAddr();
}

20
在回答问题时加上一些解释总是一个好主意,这样问题的提出者就能够真正地学到一些东西。 - trotta

2

如果您想获取开发环境的IP地址,则可以使用以下方法:

public String processRegistrationForm(HttpServletRequest request)
{
    String appUrl = request.getScheme() + "://"+ request.getLocalAddr();
    return appUrl;
}
< p> < code > request.getLocalAddr() < /code > 将返回接收请求的系统的IP地址。

希望能对您有所帮助。


-5
 import java.net.UnknownHostException;

/**
 * Simple Java program to find IP Address of localhost. This program uses
 * InetAddress from java.net package to find IP address.
 *
 */
public class IPTest { 

public static void main(String args[]) throws UnknownHostException {

    InetAddress addr = InetAddress.getLocalHost();

    //Getting IPAddress of localhost - getHostAddress return IP Address
    // in textual format
    String ipAddress = addr.getHostAddress();

    System.out.println("IP address of localhost from Java Program: " + ipAddress);

    //Hostname
    String hostname = addr.getHostName();
    System.out.println("Name of hostname : " + hostname);     
}
}

输出:

IP address of localhost from Java Program: 190.12.209.123
Name of hostname : PCLOND3433

11
这并不回答问题。问题是关于客户端IP地址,而不是服务器(本地主机)的。 - Aniket Thakur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接