如何为 Spring Boot 应用程序设置自定义 Http 标头“服务器”

Posted

技术标签:

【中文标题】如何为 Spring Boot 应用程序设置自定义 Http 标头“服务器”【英文标题】:How to set custom Http header "server" for Spring Boot applications 【发布时间】:2016-01-04 20:55:38 【问题描述】:

默认情况下,带有嵌入式 Tomcat 的 Spring Boot 应用程序的 HTTP“服务器”标头是:

Server → Apache-Coyote/1.1

如何在 Spring Boot 中实现使用另一个(自定义)“服务器”标头?

对于 Tomcat 本身,可以通过 server 属性在 XML 中的 <Connector> 元素中进行配置:

来自https://tomcat.apache.org/tomcat-8.0-doc/security-howto.html#Connectors:

服务器属性控制服务器 HTTP 标头的值。 Tomcat 4.1.x 到 8.0.x 的此标头的默认值为 Apache-Coyote/1.1。此标头可以为合法客户端和攻击者提供有限的信息。

但攻击者仍然会知道这是一个 Tomcat 服务器。

【问题讨论】:

【参考方案1】:

您可以在安全配置中使用StaticHeadersWriter 设置custom headers,这是一个Java 配置示例:

public class SecurityConfig extends WebSecurityConfigurerAdapter 
  protected void configure(HttpSecurity http) throws Exception 
    http
      .headers()
        .addHeaderWriter(new StaticHeadersWriter("Server","here to serve you"))
      ....
  
  ...

【讨论】:

【参考方案2】:

您可以使用自定义的 Filter 实现添加其他标题(或覆盖现有标题)。例如:

@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() 

        
    ;

【讨论】:

【参考方案3】:

如果你不使用 Spring Security,你可以使用 TomcatEmbeddedServletContainerFactory 并添加一个 TomcatConnectorCustomizer:

@Bean
public EmbeddedServletContainerFactory servletContainer() 
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    tomcat.setTomcatConnectorCustomizers(Collections.singletonList(c -> c.setProperty("Server", "Pleased to serve you")));
    return tomcat;

【讨论】:

【参考方案4】:

仅供参考,在最新版本的 Spring Boot 中,您只需设置“server.server-header”属性即可实现相同目的。

【讨论】:

以上是关于如何为 Spring Boot 应用程序设置自定义 Http 标头“服务器”的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Spring Boot Rest 使用自定义异常?

如何为 Spring Boot 2 添加自定义 MeterRegisty

如何为我的 Spring Boot 控制器执行单元测试?

如何为 Spring Boot 应用程序的 gradle 构建设置活动配置文件?

Spring Boot 如何为 Hikari Pool 和 jdbcTemplate 设置连接获取大小

如何为 Spring Boot/MVC 资源设置可识别的内容/MIME 类型?