2014-01-31 65 views
7

我有一個Web應用程序,用戶可以在自己的Java Web服務器(例如Tomcat)上部署該應用程序。 Web應用程序的Java端需要報告Web應用程序本身的URL(例如http://aServer.com:8080/MyApphttps://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)。這項技術可行,但涉及更多的客戶部署工作。

有沒有人有任何想法,我可以如何實現更優雅的解決方案?

感謝, 菲爾

+1

將地址放入系統屬性中並使用它。如果您將其放在不同的服務器上,請修改該屬性。如果該屬性未設置,則使應用程序拒絕啓動。 – Kayaman

+0

你嘗試過'request.getRequestURL()'嗎? –

+0

@Mustafa Genc - 不幸的是,getRequestUrl只是簡單地返回:http:// localhost:8080/MyApp/- 這是很好和完整的(它包括http和端口和Web應用程序的名稱),但不幸的是返回「localhost」! – Phil

回答

5

檢查 '主機' 請求頭。大多數客戶端添加該標題以指示他們嘗試聯繫的主機。

這是用於VirtualHosts的相同標題,所以它非常標準。這也是HTTP1.1請求中的義務。

事實上,你不能純粹從服務器端獲得值,因爲用戶可能已經爲你的服務器定義了自己的主機名。

request.getHeader("Host") 

如果你的服務器是後面一個apache儲備代理,使用ProxyPreserveHost指令,以確保主機頭保持不變。我相信其他反向代理有類似的選擇。

+0

我試過getHeader(「Host」),它只是返回「localhost:8080」。我真的想要一個解決方案,不需要通知客戶他們必須修改他們的Apache,代理服務器等等。我認爲我所要求的(就純Java而言)實際上是不可能的。 – Phil

+0

如果客戶端不會向您發送它用於與您聯繫的主機名,則無法知道它,因爲它可能因客戶端不同而不同。當然,如果你想定義一個規範名稱,那麼它是不同的,你應該只使用一些配置屬性(大量的應用程序這樣做)。至於本地主機,請檢查Firebug(或類似的)在請求中發送了哪個頭文件。如果它真的是localhost,那就意味着你的瀏覽器用localhost切換你的主機名,或者當然,你真的在​​url中使用'localhost':) –

+1

'host'請求頭是不安全的,因爲它可以被任何人改變 – deiga

0

我認爲你的問題不是java api來訪問你需要的值。

在Tomcat中例如有含有一對線像

<Engine name="Catalina" defaultHost="**localhost**"> 

<Host name="**localhost**" appBase="webapps" ... 

一個server.xml文件,如果你想要像「myhost.com」的名稱和運行Tomcat知道主機本地主機更換自己的主機名,那麼當您檢索與指定的主機名的URL,它會告訴你問

問候

0

這解決了這個問題,我的名字:

InetAddress.getLocalHost().getHostName(); 
相關問題