場景描述:伺服器端接收客戶端請求的時候,一般需要進行簽名驗證,客戶端ip限定等情況,在進行客戶端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
最終準確的客戶端資訊為:
x-forwarded-for 不為空,則為逗號前第乙個ip ;
x-real-ip不為空,則為該ip ;
否則為getremoteaddr() ;
x-forwarded-for:這是乙個 squid 開發的字段,只有在通過了http**或者負載均衡伺服器時才會新增該項。格式為x-forwarded-for:client1,proxy1,proxy2,一般情況下,第乙個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**一般會加上此請求頭。
/**
* 獲取使用者真實ip位址,不使用request.getremoteaddr()的原因是有可能使用者使用了**軟體方式避免真實ip位址,
* 可是,如果通過了多級反向**的話,x-forwarded-for的值並不止乙個,而是一串ip值
("獲取客戶端ip: "
+ ip)
;return ip;
}
tomcat 獲取訪問者真實IP
通過下面這段 可以獲取 string ip request.getheader x forwarded for if ip null ip.length 0 unknown equalsignorecase ip if ip null ip.length 0 unknown equalsignore...
怎樣獲取訪問者真實IP位址
在 jsp裡,獲取客戶端的 ip位址的方法是 request.getremoteaddr 這種方法在大部分情況下都是有效的。但是在通過了apache,squid等反向 軟體就不能獲取到客戶端的真實ip位址了。如果使用了反向 軟體,用request.getremoteaddr 方法獲取的ip位址是 1...
Java jsp獲取訪問者真實的IP位址
在jsp裡,獲取客戶端的ip位址的方法是 request.getremoteaddr 這種方法在大部分情況下都是有效的。但是在通過了apache,squid等反向 軟體就不能獲取到客戶端的真實ip位址了。如果使用了反向 軟體,用request.getremoteaddr 方法獲取的ip位址是 127...