2014-01-31 42 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(); 
相关问题