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

 手机用户2502938443 发布于 2023-01-30 10:25

我有一个用户在自己的Java Web服务器上部署的Web应用程序(例如Tomcat).Web应用程序的Java端需要报告Web应用程序本身的URL(例如http://aServer.com:8080/MyApp或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服务器中使用Server Aliases和ProxyPass,因此InetAddress的值是服务器的实际值而不是Alias.

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

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

谢谢,菲尔

1 个回答
  • 检查"主机"请求标头.大多数客户端添加该标头以指示他们尝试联系的主机.

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

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

    request.getHeader("Host")
    

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

    2023-01-30 10:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有