HttpServletRequest.getRemoteAddr() 總是返回 127.0.0.1
我們正在嘗試確定特定請求來自我們的 Java 應用程序的何處。我們已更改日誌文件以包含 IP 地址,並且我們正在使用 httpServletRequest.getRemoteAddr() 來獲取該遠端地址。
在我們執行 Tomcat 的本地開發機器上,這是可行的。在我們的 CI 環境(Mac 上的 Tomcat)中,這是可行的。
問題是在我們的暫存和生產環境中,這不起作用。我們總是從 httpServletRequest.getRemoteAddr() 看到 127.0.0.1。我們的登台和生產環境都是執行 CentOS 的 VMware VM。它們在 ESXI 內部/之上執行,並且位於 Cisco 5500 ASA 之後。
我們已經看到與此問題類似的其他文章,說要查找“X-Forwarded-For”標頭並列印它(如果存在)。它沒有。以下是通過請求的標頭的完整列表。
我們對 ASA 或 VMware 的設置方式沒有太多了解,因此,如果存在可能導致此問題的原因,請提供詳細的答案,說明如何詢問我們的 IT 團隊以解決此問題。我們認為這可能與 VMware 有關,因為我們看到的是 127.0.0.1。如果是 ASA,我們會假設我們會看到 ASA 的 IP,但我願意被告知我不正確。
請求的完整標頭:
user-agent:Mozilla/5.0+(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/) accept:text/html,application/xhtml+xml,application/xml q=0.9,*/* q=0.8 accept-language:en-US,en q=0.8 accept-charset:ISO-8859-1,UTF-8 q=0.7,* q=0.7 host:host-omitted-for-stackoverflow.com connection:keep-alive
更新 - 我們剛剛意識到我們涉及本地埠重定向:
唯一可能相關的是我們正在使用HTTP xinetd 埠重定向將 SSL 流量轉發到內部埠:
service https { disable = no flags = REUSE socket_type = stream wait = no user = root port = 443 protocol = tcp redirect = localhost 8999 log_on_failure += USERID }
事實證明,這是我們配置的 xinetd 部分正在執行此操作。我將結束這個問題並問另一個專門詢問這個問題的人。
可能網路配置文件設置不正確。可以在此處找到有關它們的更多詳細資訊:http: //docs.oracle.com/cd/E37670_01/E41138/html/ch11s02.html