簡體   English   中英

如何在 HTTP 響應 header for Apache Tomcat 中獲取服務器信息

[英]How to you get server information in HTTP response header for Apache Tomcat

我們在負載均衡器后面有 n 台服務器。 當一個 http 請求進來時,它通過輪詢方法被路由到其中一台服務器。 我的問題是,有什么辦法可以在 http 響應中發送服務器信息(請求定向到的服務器)?

如果您具有所需的信息(IP地址?服務器的友好名稱?),則可以使用response.setHeader(“ Backend-Machine”,“ ServerName”)輕松設置標頭。

真正的問題是如何獲取該信息。 大多數服務器具有多個NIC,這意味着您不能隨便挑選一個NIC並返回IP地址(您可能會得到127.0.0.1,這對任何人都沒有幫助)。 如果這對您很重要,建議您在JVM啟動時設置一個系統屬性,其中應包括您認為可以識別服務器的任何字符串。 然后,編寫一個過濾器,僅將字符串添加到每個響應中。

對子問題“您從哪里獲得信息”的簡短回答。 TLDR; 說: /opt/tomcat-<your_version>/lib$執行:

java -cp catalina.jar org.apache.catalina.util.ServerInfo

你會得到這樣的東西,這可能就是你正在尋找的東西。 我會將其縮減為僅您需要的格式,因為格式本質上只是 K/V,每行一個,以冒號作為分隔符。

Server version: Apache Tomcat/8.5.59
Server built:   Oct 6 2020 16:57:18 UTC
Server number:  8.5.59.0
OS Name:        Linux
OS Version:     5.4.0-72-generic
Architecture:   amd64
JVM Version:    1.8.0_292-8u292-b10-0ubuntu1~20.04-b10
JVM Vendor:     Private Build

我無法相信這是如此困難。 應該只有一些 Tomcat 屬性允許它將 ServerInfo 附加到響應,最有可能在“服務器”響應 header 中。

無論如何,既然我一直在挖掘這個,我不得不說

克里斯托弗·舒爾茨

以下關於需要添加到應用程序的過濾器是正確的。 至少那會解決給定應用程序的問題。 但是在同一台服務器上運行的應用程序 rest(已部署的 WAR)如何呢? 為每個添加一個過濾器? 聽起來多余。 不過,這是一個示例代碼片段(您可以在此處查看原始帖子),非常感謝 Maciej Walkowiak:

@Bean
public Filter myFilter() {
    return new Filter() {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {

        }

        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            final HttpServletResponse res = (HttpServletResponse) servletResponse;
            res.addHeader("Server", "my very custom server");

            filterChain.doFilter(servletRequest, servletResponse);
        }

        @Override
        public void destroy() {

        }
    };
}

對於勇敢的人來說,這就是它的來源。 您可以在 IntelliJ org.apache.catalina.util.ServerInfo中打開這個 class ,它將顯示:

ServerInfo 類 - 加載 ServerInfo.properties 只需抓住您感興趣的調用並將它們返回的內容填充到您在 Spring MVC 過濾器中創建的服務器 header 中。 然后是 ServerInfo.properties,您只能看到其中三個: 在此處輸入圖像描述

就個人而言,我在我的 Spring 引導項目的 application.properties 中像這樣設置服務器 header:

server.server-header="Servlet engine: [Apache Tomcat/9.0.58]"

這解決了服務器級別的問題,我不需要觸及其中包含的代碼 - 在 FireFox 開發人員工具,.network 選項卡中測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM