在如今的程式開發中,獲取客戶端的 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
在程式碼小抄可以看到更多優質程式碼,也歡迎大家積極分享,可能會獲得我們官方的小禮品 🎁~
往期推薦