我有一个 Web 应用程序,用户将其部署在自己的 Java Web 服务器(例如 Tomcat)上。 Web 应用程序的 Java 端需要报告 Web 应用程序本身的 URL(例如http://aServer.com:8080/MyApp or https://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)。这种技术可行,但需要为我的客户提供更多的部署工作。
有谁对我如何实现更优雅的解决方案有任何想法?
谢谢,
菲尔
检查“主机”请求标头。大多数客户端添加该标头来指示他们尝试联系的主机。
这与 VirtualHosts 使用的标头相同,因此它非常标准。它在 HTTP1.1 请求中也是强制性的。
事实上,您不能纯粹从服务器端获取该值,因为用户可能已经为您的服务器定义了自己的主机名。
request.getHeader("Host")
如果您的服务器位于 apache 反向代理后面,请使用代理保留主机指令以确保主机标头保持完整。我确信其他反向代理也有类似的选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)