一般都是下面**中的做法:但很多人只知道這樣能拿到,稍微有改動就不知道怎麼辦了
看看網上的各種說法,接下來容我一一講解,如有紕漏,敬請指正。
public
)//有些網路通過多層**,那麼獲取到的ip就會有多個,一般都是通過逗號(,)分割開來,並且第乙個ip為客戶端的真實ip
if(ipaddresses != null && ipaddresses.
length()
!=0)//還是不能獲取到,最後再通過request.getremoteaddr();獲取
if(ip == null || ip.
length()
==0|| unknown.
equalsignorecase
(ipaddresses)
)return ip;
}
首先有個基本概念,就是客戶端要想和服務端互動,就必須告訴服務端自己的ip,畢竟有tcp三次握手。
當然,這些都是普通使用者,特殊使用者會隱藏ip,這種暫且不說。
再從服務端說起,如果伺服器直接把ip暴漏出去,那麼request.getremoteaddr()就能拿到客戶端ip。
但目前流行的架構中,基本上伺服器都不會直接把自己的ip暴漏出去,一般前面還有一層或多層反向**,常見的nginx居多。
加了**後,相當於伺服器和客戶端中間還有一層,這時候request.getremoteaddr()拿到的就是**伺服器的ip了,並不是客戶端的ip。所以這種情況下,一般會在**頭上加x-forwarded-for等資訊,用來跟蹤原始客戶端的ip。
這時候,才會用上面的這些**。解釋下這些加上的資訊:
x-forwarded-for:
這是乙個 squid 開發的字段,只有在通過了http**或者負載均衡伺服器時才會新增該項。
格式為x-forwarded-for:client1,proxy1,proxy2,一般情況下,第乙個ip為客戶端真實ip,後面的為經過的**伺服器ip。
上面的**注釋也說的很清楚,直接擷取拿到第乙個ip。
proxy-client-ip/wl- proxy-client-ip:這個一般是經過apache http伺服器的請求才會有,用apache http做**時一般會加上proxy-client-ip請求頭,
而wl-proxy-client-ip是他的weblogic外掛程式加上的頭。
這種情況也是直接能拿到。
http_client_ip:有些**伺服器也會加上此請求頭。
x-real-ip:nginx一般用這個。
不知道你有沒有發現,上面這些頭資訊,都是各做各的,沒有乙個統一,所以**也就寫成了這樣,其實就是乙個乙個試唄。
所以指不定以後再來個什麼**伺服器,頭資訊是xx-xx-xx,那我們的**也要做相應的修改。
還有,這**只是乙個大概的思想,具體情況具體對待,因為獲取不到請求頭這些ip的情況也不在少數,哪怕**層以後都統一了,使用者層還有其他么蛾子方法,就是不讓你知道他的ip,所以總的結論就是上有政策,下有對策。
1.服務端防刷
2.記錄使用者操作
等等,總之就是服務端監控和區分客戶端的,經常會用ip作為乙個可靠指標
獲取客戶端使用者真實ip
通常通過request.servervariables remote addr 或 request.userhostaddress 來獲取客戶端ip。如果在客戶端使用了 伺服器或在伺服器前加了反向 伺服器,獲取的就是 伺服器的位址了,無法獲取使用者真實ip。怎麼獲取呢?public static s...
java 獲取客戶端真實ip方法
獲取當前網路ip 對於通過多個 的情況,第乙個ip為客戶端真實ip,多個ip按照 分割 if ipaddress null ipaddress.length 15 return ipaddress 取x forwarded for中第乙個非unknown的有效ip字串。如 x forwarded f...
Java獲取客戶端的真實IP
發生的場景 伺服器端接收客戶端請求的時候,一般需要進行簽名驗證,客戶端ip限定等情況,在進行客戶端ip限定的時候,需要首先獲取該真實的ip。一般分為兩種情況 方式一 客戶端未經過 直接訪問伺服器端 nginx,squid,haproxy 方式二 客戶端通過多級 最終到達伺服器端 nginx,squi...