意外と面倒だったのでメモ。
Spring Boot のサーブレットコンテナに Jetty を使っていると、レスポンスヘッダにバッチリ Jetty のバージョンが載ってくる:
$ curl -o/dev/null -sv http://localhost:8080/foo 2>&1 | grep '^< Server:'
< Server: Jetty(9.2.11.v20150529)
これを止めさせるには自動で Jetty サーバを作ってるロジックに、下記のような手を加える必要がある:
Config.java
@EnableAutoConfiguration
@ComponentScan(basePackageClasses = Config.class)
public class Config {
/**
* レスポンスヘッダ Server 付与する機能を潰す設定
*/
@Bean
public JettyServerCustomizer jettyServerNameSuppresser() {
return server -> {
Stream.of(server.getConnectors())
.flatMap(c -> c.getConnectionFactories().stream())
.flatMap(f -> (f instanceof HttpConnectionFactory) ? Stream.of((HttpConnectionFactory) f)
: Stream.empty())
.forEach(f -> f.getHttpConfiguration().setSendServerVersion(false));
};
}
/**
* デフォルトの Jetty サーバ作成クラスから、customizers でサーバに手を加える
*/
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory(
JettyServerCustomizer[] customizers) {
JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
factory.addServerCustomizers(customizers);
return factory;
}
}
起動してアクセスしてみる:
$ curl -o/dev/null -sv http://localhost:8080/foo 2>&1 | grep '^< Server:'
$ echo $?
1
Server ヘッダが消えているのが分かる。
「設定ファイルでちょっと設定すればOK!!」だと思っていたのにあてが外れて、思いの外苦労した。