如何在Java Web应用程序中获取服务器名称

时间:2014-01-31 14:09:47

标签: java web-applications

我有一个用户在自己的Java Web服务器上部署的Web应用程序(例如Tomcat)。 Web应用程序的Java端需要报告Web应用程序本身的URL(例如http://aServer.com:8080/MyApphttps://blah.blahSever/MyApp)。但是,由于许多用户使用端口转发和其他网络技术,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的使用接近我想要的,但由于我们在Apache2服务器中使用服务器别名和ProxyPass,因此InetAddress的值是服务器的实际值而不是别名。

我能想到的唯一技术是用户在属性文件中提供属性,Web应用程序在启动时读取该属性。如果设置了该属性,则此值用于返回完整的Web应用程序路径(例如serverUrl = https://blah.blahServer/MyApp)。这种技术可行,但需要为我的客户进行更多的部署工作。

有没有人对如何实现更优雅的解决方案有任何想法?

谢谢, 菲尔

3 个答案:

答案 0 :(得分:5)

检查“主机”请求标头。大多数客户端添加该标头以指示他们尝试联系的主机。

这与用于VirtualHosts的标题相同,因此它非常标准。它也是HTTP1.1请求中的强制性内容。

实际上,您无法纯粹从服务器端获取该值,因为用户可能已为您的服务器定义了自己的主机名。

request.getHeader("Host")

如果您的服务器位于Apache保留代理后面,请使用ProxyPreserveHost指令确保Host头保持不变。我确信其他反向代理也有类似的选择。

答案 1 :(得分:0)

我认为你的问题不是java api来访问你需要的值。

在tomcat中,例如有一个server.xml文件,其中包含一对像

这样的行
<Engine name="Catalina" defaultHost="**localhost**">

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

如果将localhost替换为您想要的名称“myhost.com”和tomcat运行的主机知道自己的主机名,那么当您检索具有指定主机名的URL时,它将显示您要求的名称< / p>

此致

答案 2 :(得分:0)

这解决了我的问题:

InetAddress.getLocalHost().getHostName();