2012-06-08 12 views
0

我的任務是確定客戶端和網絡服務器之間是否存在NAT。 我使用這種算法:如何在JSP代碼中獲取請求站點的IP地址?

  1. 用戶請求網頁
  2. JSP代碼運行並獲得所請求的網站
  3. JSP代碼獲取服務器的內部IP的IP
  4. 我比較兩個IP地址如果他們是相同的 - 這意味着沒有NAT

我的問題是:我怎麼能得到請求的網站在JSP代碼的IP地址? 我嘗試使用request.getRequestURL(),但它返回了domen的網站名稱。 此外,我試圖獲得請求的標頭主機,但它也沒有工作。 此外,我有沒有DNS服務的特定服務器,這就是爲什麼我無法獲得DNS名稱的IP。

或者我可以確定的任何想法是客戶端和服務器之間有NAT嗎?

回答

2

嘗試HttpServletRequest.getRemoteAddr()

描述說:

返回發送請求的客戶機或最後一個代理的互聯網協議(IP)地址。對於HTTP servlet,與CGI變量REMOTE_ADDR的值相同。

注意:這隻會讓你(或嘗試)客戶端IP地址。不是客戶請求的服務器。

+0

是的......但只給你TCP連接的源IP地址。如果有NAT(或代理),那將不是瀏覽器的真實IP地址。 –

0

JSP代碼不能,因爲它運行在服務器上。

我假定您實際上是指由JSP創建的頁面中的Javascript代碼,但我認爲不允許使用不可信的Javascript來查找瀏覽器的IP地址或主機名。

(有一個技巧用於獲取客戶端的IP地址,但它涉及向遠程服務器發送請求......而在您的情況下,遠程服務器只能傳遞NAT地址另一個竅門是運行一個Java applet,但我懷疑它也會碰到沙箱限制,除非用戶的瀏覽器信任這個applet。)

總之,我認爲這通常不可能服務器找出客戶端的IP地址是否是NAT。


請注意,如果您確實找到NAT地址後面的真實IP地址,那麼它可能對您沒有任何用處。 IP地址可能無法路由(因爲它位於專用範圍內和/或防火牆後面),並且在任何公共DNS服務器中都不會有名稱。