【问题标题】:Identify server on Tomcat (HttpServletRequest.getLocalAddr() fails)识别 Tomcat 上的服务器(HttpServletRequest.getLocalAddr() 失败)
【发布时间】:2013-02-08 19:48:05
【问题描述】:

在 Apache 后面设置 Tomcat,如何轻松确定服务器的 id(理想情况下为 IP 地址)?

具体情况是在负载均衡器后面设置了多个服务器,因此传入的请求主机名不唯一,不足以识别特定服务器以进行日志记录。不幸的是,使用 HttpServletRequest.getLocalAddr() 会返回相同的主机名而不是预期的 IP 地址(我假设这与这里的这个非常老的问题有关:https://issues.apache.org/bugzilla/show_bug.cgi?id=46082)。

有没有办法让getLocalAddr() 执行记录,或者是否需要其他方法来查询服务器的 IP 地址?

【问题讨论】:

  • 是返回接收请求的服务器地址,还是向服务器发送请求的客户端地址?
  • 服务器地址就是我要找的。试图找到一种简单的方法来唯一标识接收请求的服务器,而无需添加每个服务器的配置来适应。

标签: java apache tomcat


【解决方案1】:

在我们的项目中,我们使用 JMX 来获取所有配置信息。 它需要几个步骤,因为它就像向下导航 server.xml 文件 这个链接有一些信息:http://oss.wxnet.org/mbeans.html

如果你想要的只是 IP,这可能有点矫枉过正,但我​​想我会把它扔掉。

  MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
  Set<ObjectName> theConnectors = mbeanServer.queryNames(
      new ObjectName("Catalina:type=Connector,*"),
      null);
  if (theConnectors != null)
  {
      for (ObjectName nextConnectorName : theConnectors)
      {
        InetAddress theInetAddress = (InetAddress) mbeanServer.getAttribute(
          nextConnectorName,
          "address");
        if (theInetAddress != null)
        {
          ipAddress = theInetAddress.getHostAddress();
        }
        if (!StringUtil.isEmpty(ipAddress))
        {
          // found the IP address
          break;
        }
      }
  }

【讨论】:

  • 我对 JMX 很熟悉,但是如果没有为每个服务器添加额外的配置参数,我不确定是否有任何独特的属性可以轻松识别服务器。
  • 您的 server.xml 中是否有您感兴趣的 IP 地址?如果是这样,可能有办法得到它。我在答案中添加了一些代码。它显示了如何在引擎下找到连接器。您的配置可能不同,但您会看到一般方法。
  • +1,但我最终通过InetAddress.getLocalHost()获取IP地址采取了更直接的路线(也在这里回答)。
【解决方案2】:

对于我的情况,解决方案是直接获取服务器的 IP 地址,而不是尝试通过 HttpServleRequest 获取本地地址。

我通过以下方式缓存了 IP 以在我的过滤器中使用:

private static final String serverIp;
static {
    String addressString = null;
    try
    {
        InetAddress address = InetAddress.getLocalHost();
        addressString = address.getHostAddress();
    } catch (Exception e)
    {
        logger.error("Exception while attempting to determine local ip address",e);
    }

    if (addressString != null) serverIp = addressString;
    else serverIp = "unknown";
}

【讨论】:

    【解决方案3】:

    我最近(在最初的问题之后几年)遇到了类似的问题,并找到了这个问题和答案。我的问题是ServletRequest#getLocalAddr() 实现返回的是远程地址而不是本地地址。该问题是由 Tomcat v9.0.22 中的回归引起的。它已在 v9.0.23 中修复。在此处查看问题和答案:

    https://stackoverflow.com/a/57725039/9602527

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 2015-12-26
      • 2019-06-08
      • 2014-03-06
      • 2020-01-11
      • 1970-01-01
      相关资源
      最近更新 更多