2012-09-13 142 views
0

我應該捕獲客戶端機器的IP地址,他們打我的web應用程序。 谷歌搜索後,我發現有兩種方式:使用java獲取客戶端機器的IP地址

  1. request.getRemoteAddr()

  2. request.getHeader("X-FORWARDED-FOR")

但他們兩人不保證返回客戶端機器的實際IP。 此外,我應該使用struts1.2來實現,因爲應用程序是在struts1.2中開發的。

有沒有類似的struts類?

我使用以下代碼:

String ipAddress = request.getHeader("X-FORWARDED-FOR"); 
if (ipAddress == null) { 
    ipAddress = request.getRemoteAddr(); 
} 

但是當我從移動或無線設備訪問該應用程序request.getHeader("X-FORWARDED-FOR");返回null的方法。

其結果是,從方法request.getRemoteAddr(); 獲得IP的問題是檢索到的IP是私有的,不是公共 但我想公共IP客戶端的

回答

1

request.getRemoteAddr()將在大多數情況下返回正確的地址(這是Java EE的一部分,而不是struts)。他們不保證返回客戶端機器的實際IP,因爲這是TCP/IP限制的問題,而不是結構或Java本身。

+0

Heyy ..謝謝你的時間。 我已編輯的問題..請幫助 –

1

問題是沒有辦法保證它。客戶端可能是NAT,所以無論如何您都無法找到客戶端知道的地址,並且如果客戶端通過代理連接(通用於某些設備類別,或者連接來自一些地點),那麼無法保證代理會告訴你客戶的地址是什麼。那裏有一些可怕的破解代理,即使正常工作,它們仍可能被配置爲隱藏您正在查找的信息。

最簡單的技術可能是在客戶端上運行一些JavaScript來發現信息並在後臺請求中發送給您。但是,你會發現客戶的地址往往不是非常有用。您當然不能將其用於身份驗證目的(NAT的廣泛流行和通過DHCP進行動態地址分配意味着您通常會獲得具有相同「內部」地址的不同客戶端)或連接回客戶端(大多數客戶端運行強大的防火牆或支持一個),我不知道爲什麼你甚至想要記錄它。這是關於你可以要求的最無用的東西。我建議退一步從這個問題,並再次想想你真的試圖做。