在Java Web开发中,有时候我们需要获取到请求者的真实IP地址。这个需求看似简单,但实际上却有一些复杂性。因为在现实的网络环境中,用户的请求可能会经过多个代理服务器,这就使得获取真实IP地址变得有些困难。但是,不用担心,我们有一些方法可以解决这个问题。

首先,我们可以通过HttpServletRequest对象的getRemoteAddr()方法来获取IP地址。这个方法通常能够得到正确的结果,但是如果用户的请求经过了代理服务器,那么得到的可能就是代理服务器的IP地址,而不是用户的真实IP地址。代码如下:

String ipAddress = request.getRemoteAddr();

为了解决这个问题,我们可以检查一些HTTP头部信息,这些信息通常会包含用户的真实IP地址。这些头部信息包括"X-Forwarded-For"、"Proxy-Client-IP"、"WL-Proxy-Client-IP"、"HTTP_CLIENT_IP"和"HTTP_X_FORWARDED_FOR"。我们可以按照这个顺序来检查这些头部信息,如果找到了非空的头部信息,那么就可以认为我们找到了用户的真实IP地址。代码如下:

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.getHeader("HTTP_CLIENT_IP");
}
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
    ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
    ipAddress = request.getRemoteAddr();
}

这段代码首先尝试获取"X-Forwarded-For"头部信息,如果没有找到或者值为"unknown",那么就尝试获取"Proxy-Client-IP"头部信息,以此类推,直到找到一个非空且不为"unknown"的头部信息。如果所有的头部信息都没有找到,那么就使用getRemoteAddr()方法获取IP地址。

需要注意的是,"X-Forwarded-For"头部信息可能包含多个IP地址,这是因为用户的请求可能经过了多个代理服务器。这些IP地址按照从用户到服务器的顺序排列,所以第一个IP地址就是用户的真实IP地址。如果"X-Forwarded-For"头部信息包含多个IP地址,我们需要进行一些处理来获取第一个IP地址。代码如下:

if(ipAddress != null && ipAddress.length() > 15) { //"***.***.***.***".length() = 15
    if(ipAddress.indexOf(",") > 0) {
        ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
    }
}

这段代码检查IP地址的长度,如果长度大于15,那么就认为IP地址包含多个,然后使用indexOf()方法找到第一个逗号的位置,然后使用substring()方法获取第一个IP地址。

以上就是在Java中获取请求者真实IP地址的方法。虽然这个过程有些复杂,但是只要按照上述步骤进行,就可以获取到正确的结果。希望这个方法对你有所帮助。

云服务器推荐

蓝易云国内/海外高防云服务器推荐


海外免备案云服务器链接:www.tsyvps.com

蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。


百度搜索:蓝易云

最后修改:2023 年 10 月 23 日
如果觉得我的文章对你有用,请随意赞赏