27.4.4 自定义内嵌servlet容器

常见的Servlet容器配置可以通过Spring Environment进行设置,通常将这些属性定义到application.properties文件中。

常见的服务器配置包括:

  1. 网络设置:监听进入Http请求的端口(server.port),接口绑定地址server.address等。

  2. Session设置:session是否持久化(server.servlet.session.persistence),session超时时间(server.servlet.session.timeout),数据存放位置(server.servlet.session.store-dir),session-cookie配置(server.servlet.session.cookie.*)。

  3. Error管理:错误页面的位置(server.error.path)等。

  4. SSL

Spring Boot会尽量暴露常用设置,但这并不总是可能的。对于不可能的情况,可以使用专用的命名空间提供server-specific配置(查看server.tomcatserver.undertow)。例如,可以根据内嵌servlet容器的特性对access logs进行不同的设置。

具体参考ServerProperties

编程方式的自定义

如果需要以编程方式配置内嵌servlet容器,你可以注册一个实现WebServerFactoryCustomizer接口的Spring bean。WebServerFactoryCustomizer能够获取到包含很多自定义setter方法的ConfigurableServletWebServerFactory,你可以通过这些setter方法对内嵌容器自定义。Tomcat,Jetty和Undertow有独立的变体。下面的例子展示了以编程的方式设置端口:

import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}

直接自定义ConfigurableServletWebServerFactory

如果以上自定义手法过于受限,你可以自己注册TomcatServletWebServerFactoryJettyServletWebServerFactoryUndertowServletWebServerFactory

@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setPort(9000);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html");
return factory;
}

很多配置选项提供setter方法,有的甚至提供一些受保护的钩子方法以满足你的某些特殊需求,具体参考源码或相关文档。