如何为Spring Boot应用程序设置自定义的Http头“server”

6
默认情况下,使用嵌入式Tomcat的Spring Boot应用程序的HTTP“服务器”标头为:
Server → Apache-Coyote/1.1

Spring Boot 中如何实现使用另一个(自定义)“server”头部?对于Tomcat本身,可以通过XML中的<Connector>元素配置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个回答

10

您可以使用StaticHeadersWriter在您的安全配置中设置自定义标头,这是一个Java配置示例:

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

8

提示一下,在最新版本的Spring Boot中,您只需设置"server.server-header"属性即可达到相同的效果。


4

您可以通过自定义 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
如果您不使用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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接