> For the complete documentation index, see [llms.txt](https://jack80342.gitbook.io/spring-boot/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jack80342.gitbook.io/spring-boot/iv.-spring-boot-features/27.-developing-web-applications/27.4-embedded-servlet-container-support/27.4.4-customizing-embedded-servlet-containers.md).

# 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](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#howto-configure-ssl)。
5. [HTTP压缩](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#how-to-enable-http-response-compression)

Spring Boot会尽量暴露常用设置，但这并不总是可能的。对于不可能的情况，可以使用专用的命名空间提供server-specific配置（查看`server.tomcat`，`server.undertow`）。例如，可以根据内嵌servlet容器的特性对[access logs](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#howto-configure-accesslogs)进行不同的设置。

**注** 具体参考[ServerProperties](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java)。

**编程方式的自定义**

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

```java
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**

如果以上自定义手法过于受限，你可以自己注册`TomcatServletWebServerFactory`，`JettyServletWebServerFactory`或`UndertowServletWebServerFactory`。

```java
@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方法，有的甚至提供一些受保护的钩子方法以满足你的某些特殊需求，具体参考源码或相关文档。
