我想在Struts2中獲取客戶端IP地址。該請求通過Apache Web服務器路由到Tomcat服務器,兩臺服務器都駐留在同一臺物理服務器上。客戶端和Apache之間的連接是安全的,但不在Apache和Tomcat之間。當我嘗試獲取客戶端IP地址時,我總是得到127.0.0.1。如何從Apache Web服務器獲取Struts2/Servlet中的客戶端IP地址?如何在Struts2/Servlet中從Apache Web服務器獲取客戶端IP地址?
在此先感謝!
我想在Struts2中獲取客戶端IP地址。該請求通過Apache Web服務器路由到Tomcat服務器,兩臺服務器都駐留在同一臺物理服務器上。客戶端和Apache之間的連接是安全的,但不在Apache和Tomcat之間。當我嘗試獲取客戶端IP地址時,我總是得到127.0.0.1。如何從Apache Web服務器獲取Struts2/Servlet中的客戶端IP地址?如何在Struts2/Servlet中從Apache Web服務器獲取客戶端IP地址?
在此先感謝!
客戶端的IP地址在一個servlet,你可以得到如此 -
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// Proxy
String userIpAddress = httpServletRequest.getHeader("X-Forwarded-For");
if(userIpAddress == null) {
userIpAddress = request.getRemoteAddr();
}
當我試圖讓客戶端IP地址,我總是127.0.0.1。
這是因爲,當你看到它在Tomcat的servlet的請求已被(反向)由Apache前端代理,以及Apache < - > Tomcat的流量會在回網絡。
解決方法是檢查代理添加的頭;例如見@阿列克謝的答案。
幾件事情要注意:不是由HTTP規範規定
此行爲(加入標題代理)的。
不同的代理行爲有所不同;例如他們可能會添加不同的標題。
請求可能會經過多個代理。
一般來說,不能保證代理人說的是實話,或者說它會根本揭示信息。
「終極」客戶端IP地址可能是NAT地址......這意味着您將難以識別真正的客戶端。
感謝您的積分,up-voteed。 – San
如果'userIpAddress'不是'null',它是否也包含代理地址?如果是這樣,請幫我決定在數據庫中存儲'userIpAddress'值的最大長度。謝謝! – San
不客氣。該標題將包含「真實」IP地址。大多數代理服務器都會發送帶有「x-forwarded-for」標頭的請求。但是有很多匿名代理服務器,它們不會傳遞任何額外的頭文件。 –
標題中字段的一般格式是:'X-Forwarded-For:client,proxy1,proxy2,...,proxyN',其中值是以逗號+空格分隔的IP地址列表,最左邊的是原始客戶端以及每個通過請求的後續代理添加接收請求的IP地址。 @Stephen C寫道。要獲得代理服務器的IP(如果使用),只需使用'getRemoteAddr()'。 –