当前位置: 欣欣网 > 码农

今日代码大赏 | Java 获取客户端 IP 地址

2024-04-23码农

在如今的程序开发中,获取客户端的 IP 地址已成为不可或缺的一环。它不仅能够帮助我们精准追踪用户行为,分析流量来源,还能在出现问题时快速定位到错误的发生者。

今天,我们分享一个用 Java 编写的客户端 IP 地址获取工具类,示例代码如下:

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
/**
 * 网络工具类
 *
 * @author <a href="https://github.com/liyupi">程序员鱼皮</a>
 * @from <a href="https://yupi.icu">编程导航知识星球</a>
 */

public classNetUtils {
/**
* 获取客户端 IP 地址
*
@param request 请求
@return {@link String}
*/

publicstatic String getIpAddress(HttpServletRequest request) {
Stringip = request.getHeader("x-forwarded-for");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if ("127.0.0.1".equals(ip)) {
// 根据网卡取本机配置的 IP
InetAddressinet = null;
try {
inet = InetAddress.getLocalHost();
catch (Exception e) {
e.printStackTrace();
}
if (inet != null) {
ip = inet.getHostAddress();
}
}
}
// 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ip != null && ip.length() > 15) {
if (ip.indexOf(",") > 0) {
ip = ip.substring(0, ip.indexOf(","));
}
}
if (ip == null) {
return"127.0.0.1";
}
return ip;
}
}


在这个例子中,我们首先尝试从请求头中获取 x-forwarded-for,这是代理服务器标准字段,用于表示原始请求的来源 IP 地址。如果这个字段不存在或者为未知,我们继续尝试获取其他可能的代理 IP 地址字段。如果所有代理 IP 地址字段都不存在或未知,我们最后尝试获取请求的远程地址,即客户端 IP 地址。

如果远程地址是本地回环地址(127.0.0.1),我们尝试获取本机的 IP 地址。在获取 IP 地址的过程中,我们还需要处理可能存在的多个代理 IP 地址的情况,只保留第一个 IP 地址作为客户端的真实 IP。

今天的代码大赏就到这里。希望通过这篇文章,你能够对如何利用 Java 获取客户端 IP 地址的工具类有一个更深入的理解。如果你对 Java 工具类感兴趣,或者想要了解更多不同场景下的工具类实现,欢迎在评论区留下自己的想法和建议。

完整代码片段来源于代码小抄,欢迎点击进入小程序阅读!

在线访问:https://www.codecopy.cn/post/7ytalw

在代码小抄可以看到更多优质代码,也欢迎大家积极分享,可能会获得我们官方的小礼品 🎁~

往期推荐