2013-02-08 47 views
1

在Apache後面安裝Tomcat時,如何才能輕鬆確定服務器的標識(IP地址)?在Tomcat上識別服務器(HttpServletRequest.getLocalAddr()失敗)

具體情況是多個服務器設置在負載平衡器後面,因此傳入的請求主機名稱是非唯一的,並且不足以標識特定的服務器以進行日誌記錄。不幸的是,使用HttpServletRequest.getLocalAddr()會返回相同的主機名而不是預期的IP地址(我認爲這與這個非常古老的問題有關:https://issues.apache.org/bugzilla/show_bug.cgi?id=46082)。

有沒有一種方法,使getLocalAddr()執行如記錄,或需要其他的方法來查詢服務器的IP地址?

+0

你想返回服務器收到請求,或在客戶端向服務器發送請求的地址的地址? – 2013-02-08 19:51:18

+0

服務器地址是我正在尋找的。試圖找到一種簡單的方法來唯一標識接收請求的服務器,而無需添加每個服務器配置來適應。 – 2013-02-08 20:42:05

回答

1

對於我的情況,解決辦法是讓服務器的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"; 
} 
2

在我們的項目中,我們使用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; 
     } 
     } 
    } 
+0

我對JMX很熟悉,但沒有爲每個服務器添加額外的配置參數,我不確定是否有任何可以輕鬆識別服務器的獨特屬性。 – 2013-02-08 20:43:22

+0

你的server.xml是否有你感興趣的IP地址?如果是這樣,可能有辦法得到它。 我已經添加了一些代碼給我的答案。它顯示瞭如何在引擎下找到連接器。你的配置可能不同,但你會看到一般的方法。 – 2013-02-08 20:57:58

+0

+1,但我通過'InetAddress.getLocalHost()'獲得了IP地址,最終得到了稍微更直接的路由(這裏也回答了這個問題)。 – 2013-02-08 22:36:19