Loading... 在Java Web开发中,有时候我们需要获取到请求者的真实IP地址。这个需求看似简单,但实际上却有一些复杂性。因为在现实的网络环境中,用户的请求可能会经过多个代理服务器,这就使得获取真实IP地址变得有些困难。但是,不用担心,我们有一些方法可以解决这个问题。 首先,我们可以通过HttpServletRequest对象的getRemoteAddr()方法来获取IP地址。这个方法通常能够得到正确的结果,但是如果用户的请求经过了代理服务器,那么得到的可能就是代理服务器的IP地址,而不是用户的真实IP地址。代码如下: ```java String ipAddress = request.getRemoteAddr(); ``` 为了解决这个问题,我们可以检查一些HTTP头部信息,这些信息通常会包含用户的真实IP地址。这些头部信息包括"X-Forwarded-For"、"Proxy-Client-IP"、"WL-Proxy-Client-IP"、"HTTP_CLIENT_IP"和"HTTP_X_FORWARDED_FOR"。我们可以按照这个顺序来检查这些头部信息,如果找到了非空的头部信息,那么就可以认为我们找到了用户的真实IP地址。代码如下: ```java 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地址。代码如下: ```java 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地址的方法。虽然这个过程有些复杂,但是只要按照上述步骤进行,就可以获取到正确的结果。希望这个方法对你有所帮助。 #### [云服务器推荐](https://www.tsyvps.com/) #### [蓝易云](https://www.tsyvps.com/)国内/海外高防云服务器推荐 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.tsyvps.com" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://www.8kiz.cn/img/6.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">蓝易云-五网CN2服务器【点我购买】</p> <div class="inster-summary text-muted"> <span style='color: red;'>蓝易云采用KVM高性能架构,稳定可靠,安全无忧!<br>蓝易云服务器真实CN2回国线路,不伪造,只做高质量海外服务器。</span> </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> --- **<span style='color:#000000'>海外免备案云服务器链接:[www.tsyvps.com](https://www.tsyvps.com)</span>** **<span style='color:#DC143C'>蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。</span>** --- #### **百度搜索:[蓝易云](https://www.baidu.com/s?ie=UTF-8&wd=%E8%93%9D%E6%98%93%E4%BA%91)** 最后修改:2023 年 10 月 23 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏