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

标签 java web-applications

我有一个用户部署在他们自己的 Java Web 服务器(例如 Tomcat)上的 Web 应用程序。 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 )。这种技术可行,但需要为我的客户进行更多部署工作。

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

谢谢, 菲尔

最佳答案

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

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

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

request.getHeader("Host")

如果您的服务器位于 apache 储备代理之后,请使用 ProxyPreserveHost指令以确保主机 header 保持完整。我确信其他反向代理也有类似的选项。

关于java - 如何在 Java Web 应用程序中获取服务器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21482093/

相关文章:

java - WSDL 文件在浏览器中加载,但不在代码中加载

javascript - 无法从 openWeatherMap api JavaScript 获取数据

javascript - 我可以使用 Node 来为单独服务器上的 Web 应用程序提供支持吗?

java - 用于部署用 Java 编写的分层业务应用程序的模式

web-applications - Spring - 设置HandlerMapping优先级

java - 如何动态创建 VCS 或 ICS 文件(Outlook)?

java - 删除应用程序时是否删除与应用程序关联的共享首选项?

java - 如何使用 ExecutorService 等待所有线程完成?

java - 属性文件。解析出某些文本。 (字符串)

oop - 有关使用 Coldfusion 9 进行 OOP 应用程序设计的书籍、教程和视频