我有一個Web應用程序,用戶可以在自己的Java Web服務器(例如Tomcat)上部署該應用程序。 Web應用程序的Java端需要報告Web應用程序本身的URL(例如http://aServer.com:8080/MyApp或https://blah.blahSever/MyApp)。但是,由於許多用戶使用端口轉發和其他網絡技術,因此Web應用程序經常報告錯誤的名稱。如何在Java Web應用程序中獲取服務器名稱
我已經嘗試了以下技術,但通常它們並不真正生成用戶需要的內容。
注(請求是一個HttpServletRequest的)
request.getLocalAddr(); // Returns: 127.0.0.1
request.getLocalName(); // Returns: localhost
request.getServerName(); // Returns: localhost
request.getServerPort(); // Returns: 8080
request.getContextPath(); // Returns: /MyApp
request.getScheme(); // Returns: http
InetAddress.getLocalHost().getHostName(); // Returns: serverXXX-XXX-XXX-XX.xxxx-xxxxxxx.net
InetAddress.getLocalHost().getHostAddress(); // Returns: xxx.xxx.xxx.xxx (ip address)
InetAddress.getLocalHost().getCanonicalHostName(); // Returns: serverXXX-XXX-XXX-XX.xxxx-xxxxxxx.net
使用InetAddress類的獲得接近我想要的,但由於我們使用的是服務器別名和的ProxyPass在我們的Apache2服務器,從InetAddress類值實際值的服務器而不是別名。
我能想到的唯一技術就是用戶在屬性文件中提供屬性,Web應用程序在啓動時讀取該屬性。如果該屬性已設置,則此值用於返回完整的Web應用程序路徑(例如serverUrl = https://blah.blahServer/MyApp)。這項技術可行,但涉及更多的客戶部署工作。
有沒有人有任何想法,我可以如何實現更優雅的解決方案?
感謝, 菲爾
將地址放入系統屬性中並使用它。如果您將其放在不同的服務器上,請修改該屬性。如果該屬性未設置,則使應用程序拒絕啓動。 – Kayaman
你嘗試過'request.getRequestURL()'嗎? –
@Mustafa Genc - 不幸的是,getRequestUrl只是簡單地返回:http:// localhost:8080/MyApp/- 這是很好和完整的(它包括http和端口和Web應用程序的名稱),但不幸的是返回「localhost」! – Phil