java後端獲取客戶端(使用者)真實ip,原理

2021-09-24 20:14:11 字數 2557 閱讀 3978

一般都是下面**中的做法:但很多人只知道這樣能拿到,稍微有改動就不知道怎麼辦了

看看網上的各種說法,接下來容我一一講解,如有紕漏,敬請指正。

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...