Java獲取客戶端的真實IP

2021-08-19 15:52:23 字數 2296 閱讀 1765

發生的場景:伺服器端接收客戶端請求的時候,一般需要進行簽名驗證,客戶端ip限定等情況,在進行客戶端ip限定的時候,需要首先獲取該真實的ip。一般分為兩種情況:

方式一、客戶端未經過**,直接訪問伺服器端(nginx,squid,haproxy);

方式二、客戶端通過多級**,最終到達伺服器端(nginx,squid,haproxy);

客戶端請求資訊都包含在httpservletrequest中,可以通過方法getremoteaddr()獲得該客戶端ip。此時如果在使用方式一形式,可以直接獲得該客戶端真實ip。而如果是方式二中通過**的形式,此時經過多級反向的**,通過方法getremoteaddr()得不到客戶端真實ip,可以通過x-forwarded-for獲得**後請求資訊。當客戶端請求被**,ip將會追加在其後並以逗號隔開,例如:10.47.103.13,4.2.2.2,10.96.112.230。

請求中的引數:

request.getheader("x-forwarded-for") : 10.47.103.13,4.2.2.2,10.96.112.230

request.getheader("x-real-ip") : 10.47.103.13

request.getremoteaddr():10.96.112.230

客戶端訪問經過**,ip將會追加在其後並以逗號隔開。最終準確的客戶端資訊為:

**示例:

/**

* 獲取使用者真實ip位址,不使用request.getremoteaddr()的原因是有可能使用者使用了**軟體方式避免真實ip位址,

* 可是,如果通過了多級反向**的話,x-forwarded-for的值並不止乙個,而是一串ip值

system.out.println("獲取客戶端ip: " +ip);

return

ip;

}

此時,正常情況之下可以獲取客戶端真實的ip。需要注意的是對於伺服器端採用負載的形式,需要配置儲存x-forwarded-for。目前負載的形式有haproxy、nginx等形式。結構圖如下:

我接觸的伺服器端配置負載使用haproxy,相對於的配置如下:

option httplogoption forwardfor // 配置haproxy會把客戶端的ip資訊傳送給伺服器,在http請求中新增"x-forwarded-for"字段。default_backend drm

java 獲取客戶端真實ip方法

獲取當前網路ip 對於通過多個 的情況,第乙個ip為客戶端真實ip,多個ip按照 分割 if ipaddress null ipaddress.length 15 return ipaddress 取x forwarded for中第乙個非unknown的有效ip字串。如 x forwarded f...

獲取客戶端真實ip

很多時候我們需要獲取客戶端的訪問ip,ip位址合法驗證 long sprintf u ip2long ip ip long array ip,long array 0.0.0.0 0 return ip type 一 如果沒有使用 伺服器,remote addr 客戶端iphttp x forwar...

獲取客戶端真實IP

server http x real ip nginx 模式下,獲取客戶端真實ip server http client ip 端的 有可能存在,可偽造 server http x forwarded for 使用者是在哪個ip使用的 有可能存在,也可以偽造 server http cdn src ...