【问题标题】:How to get the server name in a Java Web Application如何在 Java Web 应用程序中获取服务器名称
【发布时间】:2014-01-31 14:09:46
【问题描述】:

我有一个用户部署在他们自己的 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)。这种技术可行,但需要为我的客户做更多的部署工作。

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

谢谢, 菲尔

【问题讨论】:

  • 将地址放在系统属性中并使用它。如果您将其放在不同的服务器上,请修改该属性。如果未设置该属性,则使应用拒绝启动。
  • 你试过request.getRequestURL()吗?
  • @Mustafa Genc - 不幸的是 getRequestUrl 只是简单地返回:localhost:8080/MyApp - 这很好且完整(它包括 http 和端口以及 Web 应用程序名称),但不幸的是返回“localhost”!
  • @Kayaman - 我认为您的方法可能是我所采用的方法!
  • @Phil 这绝对是最简单(而且效果很好,除非你经常切换域名)的方法。

标签: java web-applications


【解决方案1】:

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

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

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

request.getHeader("Host")

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

【讨论】:

  • 我试过 getHeader("Host") ,它只返回“localhost:8080”。我真的想要一个不涉及通知客户他们必须修改他们的 Apache、代理等的解决方案。我认为我所要求的(就纯 Java 而言)实际上是不可能的。
  • 如果客户端没有向您发送它用来联系您的主机名,您无法知道它,因为每个客户端可能不同。当然,如果你想定义一个规范的名称,那么它就不同了,你应该只使用一些配置属性(很多应用程序都是这样做的)。至于 localhost,请使用 Firebug(或类似的)检查请求中发送了哪个标头。如果它真的是 localhost,这意味着您的浏览器以某种方式将您的主机名切换为 localhost,或者当然,您确实在 url 中使用了 'localhost' :)
  • host 请求标头使用起来不安全,因为它可以被任何人更改
  • @deiga 链中的任何人都可以更改任何标头——仍然,因为主机没有单一名称,这是最接近客户端使用的可靠来源的东西作为与您联系的主机名,是客户端本身。你只需要冒险。
  • “你只需要冒险。”是我读过的最糟糕的建议。 NOBODY 应该使用这种方法来确定他们的服务器名称。最安全的方法是将您需要的值设置为配置属性,并在需要时从您的上下文/环境中读取它。当然,这不是最有效的方法,但至少您不会公然让您的用户面临一些相当严重的安全威胁。
【解决方案2】:

这为我解决了这个问题:

InetAddress.getLocalHost().getHostName();

【讨论】:

    【解决方案3】:

    我认为您的问题不在于访问所需值的 java api。

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

    这样的行
    <Engine name="Catalina" defaultHost="**localhost**">
    
    <Host name="**localhost**"  appBase="webapps"  ...
    

    如果你将 localhost 替换为你想要的名称,例如“myhost.com”,并且运行 tomcat 的主机知道它自己的主机名,那么当你检索具有指定主机名的 url 时,它将显示你要求的名称

    问候

    【讨论】:

      猜你喜欢
      • 2010-12-22
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2012-08-31
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多