使用Java實現(xiàn)獲取客戶端IP地址
首先是獲取 IP,直接上代碼
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 獲取IP地址工具類
*/
public final class IpUtil {
private static final String UNKNOWN = "unknown";
private static final String IPV6_LOCAL = "::1"; // 推薦用壓縮形式
private IpUtil(){
throw new AssertionError();
}
/**
* 獲取請求用戶的IP地址
* @return
*/
public static String getRequestIp() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
return getRequestIp(request);
}
/**
* 獲取請求用戶的IP地址
* @param request
* @return
*/
public static String getRequestIp(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
// 處理多級代理,獲取第一個非 unknown 的有效 IP
if (ip != null && !ip.isEmpty() && !UNKNOWN.equalsIgnoreCase(ip)) {
ip = ip.split(",")[0].trim(); // 取第一個 IP
} else {
ip = request.getHeader("X-Real-IP"); // 常見于 Nginx 代理
}
// 備用方案:嘗試從其他頭部獲取
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(); // 默認(rèn)獲取遠(yuǎn)程地址
}
// 如果是本地回環(huán)地址,則返回本地機器的 IP
if (IPV6_LOCAL.equals(ip) || "127.0.0.1".equals(ip)) {
ip = getLocalhostIp(); // 獲取本地 IP
}
return ip;
}
private static String getLocalhostIp() {
try {
InetAddress inetAddress = InetAddress.getLocalHost();
return inetAddress.getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
return "127.0.0.1"; // 如果無法獲取,則返回回環(huán)地址
}
}
}
但是今天發(fā)現(xiàn)一個問題,所有的地址都顯示為 127.0.0.1,我一琢磨應(yīng)該是 nginx 代理導(dǎo)致的,所以給 nginx 加上下面的配置
server {
listen 80;
server_name your-domain.com;
location / {
# 轉(zhuǎn)發(fā)客戶端的真實 IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# 代理轉(zhuǎn)發(fā)請求到網(wǎng)關(guān)服務(wù)
proxy_pass http://localhost:1000/;
}
}
重啟 nginx 后再次請求就拿到了真實的 IP 地址了(注意所謂的真實 IP 不一定真實,這個東西是可以偽造的,至于防范措施大家自己去搜,道高一尺魔高一丈)
到此這篇關(guān)于使用Java實現(xiàn)獲取客戶端IP地址的文章就介紹到這了,更多相關(guān)Java獲取客戶端IP地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea普通javaweb項目如何部署到tomcat(讀取web.xml文件)
這篇文章主要介紹了idea普通javaweb項目如何部署到tomcat(讀取web.xml文件),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Java 8對LinkedHashSet元素進行排序的操作方法
LinkedHashSet 是 Java 集合框架中的一個類,它繼承自 HashSet,并實現(xiàn)了 Set 接口,然而,LinkedHashSet 不支持元素的排序,它僅僅保持插入順序,所以本文給大家介紹了Java 8 如何對 LinkedHashSet 元素進行排序,需要的朋友可以參考下2024-11-11
mybatis攔截器實現(xiàn)數(shù)據(jù)權(quán)限項目實踐
本文主要介紹了mybatis攔截器實現(xiàn)數(shù)據(jù)權(quán)限項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
解決運行jar包出錯:ClassNotFoundException問題
這篇文章主要介紹了解決運行jar包出錯:ClassNotFoundException問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

