2014-01-07 24 views
4

大家好,感謝您的幫助,的java的HttpRequest的getRemoteAddr回百達127.0.0.1

我正在開發使用JSF和出於安全原因,我需要捕捉的時候,他確實在日誌中的用戶IP的網絡應用程序。

我使用下面的代碼:

HttpServletRequest request=(HttpServletRequest) context.getExternalContext().getRequest(); 
remoteAddress=request.getRemoteAddr(); 

的事情是,當我檢查我的應用程序日誌,以檢查它總是返回127.0.0.1的IP地址。

[INFO] 07/01/2014 11時04分22秒 - >用戶XXX從127.0.0.1連接

[INFO] 07/01/2014 11點27分43秒 - >用戶XXX連接從127.0.0.1

更多細節:

  • 我使用Tomcat 7
  • 我的服務器Debian的虛擬機
  • 我連接到服務器從另一臺PC從一個內部工作包含虛擬機。

我已搜查在互聯網和閱讀有關使用:

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

但它並沒有解決我的問題。

我現在很迷茫,任何想法爲什麼會發生這種情況?

+0

我想如果你是從同一臺物理機器進行測試,它將始終顯示本地IP(127.0.0.1).. – Ketan

+0

這是我沒有從同一臺物理機器上測試的東西。 –

+0

您的虛擬機是否具有公共IP,或者您使用某種本地NAT或基於iptables的端口轉發?您是通過Apache前端訪問Tomcat還是直接調用Tomcat? – jarnbjo

回答

2

首先,檢查您的http服務器是否應該轉發標頭。你,你使用nginx的,這應該工作

proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

如果你已經這樣做了,就可以完成,使用Tomcat的RemoteIpValve

<Valve className="org.apache.catalina.valves.RemoteIpValve" 
      remoteIpHeader="X-Forwarded-For" 
      requestAttributesEnabled="true" 
      internalProxies="127.0.0.1" /> 

這樣一來,當你調用request.getRemoteAddr(),這將是提供正確的信息。