繁体   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