如何设置自定义Http标头"服务器" for Spring Boot applications

时间:2015-10-07 14:46:35

标签: spring tomcat spring-security spring-boot

默认情况下,HTTP"服务器"嵌入式Tomcat的Spring Boot应用程序的标题是:

Server → Apache-Coyote/1.1

如何在 Spring Boot 中实现另一个(自定义)"服务器"头?

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

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

  

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

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

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

您可以使用自定义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() {

        }
    };
}

答案 2 :(得分:3)

仅供参考,在最新版本的Spring Boot中,您只需设置&#34; server.server-header&#34;财产实现相同。

答案 3 :(得分:2)

如果您不使用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;
}