Springboot包括对嵌入式Tomcat、Jetty和Underow服务器的支持。大多数开发人员使用适当的“starter”来获得完全配置的实例。默认情况下,嵌入式服务器监听端口8080上的HTTP请求。

如果选择在CentOS上使用Tomcat,请注意,默认情况下,临时目录用于存储编译的JSP、文件上载等。在应用程序运行时,tmpwatch可能会删除此目录,从而导致失败。为了避免这种行为,您可能需要自定义tmpWatch配置,使tomcat.*目录不会被删除,或者配置server.tomcat.basedir ,使嵌入的Tomcat使用不同的位置。

1. Servlets, 过滤器, 和监听器
当使用嵌入式servlet容器时,您可以通过使用Spring Beans或扫描servlet组件来注册servlet、过滤器和servlet规范中的所有监听器(如HttpSessionListener)。

将servlet、过滤器和侦听器注册为Spring Bean
任何是Spring Bean类型的Servlet、Filter或Listener侦听器实例都会注册到嵌入的容器中。这将非常方便您在配置过程中引用application.properties中的值。

默认情况下,如果上下文只包含一个servlet,则将其映射到/。对于有多个servlet bean,bean名称被用作路径前缀。过滤器映射到/*。

如果基于约定的映射不够灵活,可以使用ServletRegistrationBean, FilterRegistrationBean, 和 ServletListenerRegistrationBean类来完成自定义控制。

SpringBoot提供了许多可以定义过滤器bean的自动配置。下面是一些过滤器及其各自顺序的示例(低阶值意味着高优先级):

Servlet Filter Order
OrderedCharacterEncodingFilter Ordered.HIGHEST_PRECEDENCE
WebMvcMetricsFilter Ordered.HIGHEST_PRECEDENCE + 1
ErrorPageFilter Ordered.HIGHEST_PRECEDENCE + 1
HttpTraceFilter Ordered.LOWEST_PRECEDENCE - 10

通常情况下,让过滤器beans保持无序是安全的。

如果需要特定的顺序,则应避免配置以Ordered.HIGHEST_PRECEDENCE读取请求正文的过滤器,因为它可能与应用程序的字符编码配置相反。如果servlet过滤器包装了请求,则应使用小于或等于OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER的顺序对其进行配置。

2. Servlet上下文初始化
嵌入式servlet容器不会直接执行servlet 3.0+以上的javax.servlet.ServletContainerInitializer接口和Spring的org.springframework.web.WebApplicationInitializer接口。这是一个专门的设计决策,旨在降低war文件中运行的第三方库可能会破坏Springboot应用程序的风险。

如果需要在Springboot应用程序中执行servlet上下文初始化,那么应该注册一个实现了org.springframework.boot.web.servlet.ServletContextInitializer接口的bean。单独onStartup 方法提供对ServletContext的访问,如果需要,还可以轻松用作现有WebApplicationInitializer的适配器。

扫描servlet、过滤器和侦听器
使用嵌入式容器时,可以通过使用@ServletComponentScan启用有@WebServlet, @WebFilter, 和@WebListener注释的类,进行自动注册。

@ServletComponentScan 在一个独立的容器中没有任何效果,在这个容器中使用了容器的内置发现机制。

3. ServletWebServerApplicationContext
在后台,Springboot使用不同类型的ApplicationContext来支持嵌入式servlet容器。ServletWebServerApplicationContext是一种特殊类型的WebApplicationContext,它通过搜索单个ServletWebServerFactory bean来引导自身。通常自动配置了TomcatServletWebServerFactory, JettyServletWebServerFactory, 或UndertowServletWebServerFactory。

您通常不需要知道这些实现类。大多数应用程序都是自动配置的,并代表了您创建适当的ApplicationContext和ServletWebServerFactory。

4. 自定义嵌入的servlet容器
可以使用Spring环境属性配置常见的servlet容器设置。通常,您将在application.properties文件中定义属性。

常见的服务器设置包括:

网络设置:侦听传入HTTP请求的端口(server.port)、绑定到server.address的接口地址等。
会话设置:会话是否持久(server.servlet.session.persistence)、会话超时(server.servlet.session.timeout)、会话数据位置(server.servlet.session.store-dir)和会话cookie配置(server.servlet.session.cookie.*)。
错误管理:错误页(server.error.path)的位置等。
SSL
HTTP压缩
SpringBoot尽可能地尝试公开公共设置,但这并不总是可能的。对于这些情况,专用命名空间提供特定于服务器的自定义(请参阅server.tomcat和server.undertow)。例如,可以使用嵌入的servlet容器的特定功能配置访问日志。

有关完整属性列表,请参见ServerProperties 类。
程序化定制
如果需要以编程方式配置嵌入的servlet容器,可以注册一个实现WebServerFactoryCustomizer 接口的SpringBean。WebServerFactoryCustomizer 提供对ConfigurableServletWebServerFactory的访问,其中包括许多自定义设置器方法。以下示例以编程方式显示如何设置端口:

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 {

@Override
public void customize(ConfigurableServletWebServerFactory server) {
    server.setPort(9000);
}

}
TomcatServletWebServerFactory, JettyServletWebServerFactory 和UndertowServletWebServerFactory是可配置的 ConfigurableServletWebServerFactory的专用子类,分别为Tomcat、Jetty和Undertow提供了额外的自定义设置方法。
直接自定义ConfigurableServletWebServerFactory
如果前面的自定义技术太有限,您可以自己注册TomcatServletWebServerFactory, JettyServletWebServerFactory或 UndertowServletWebServerFactory的bean。

@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。如果您需要做一些更奇特的事情,还提供了一些受保护的“hooks”方法。有关详细信息,请参阅源代码文档。

5. JSP限制
当运行一个使用嵌入式servlet容器的Springboot应用程序(并打包为可执行的存档文件)时,JSP支持中存在一些限制:

(1)、通过Jetty和Tomcat,war包应该可以工作。一个可执行的war包将在java -jar启动时运行,并且也可以部署到任何标准容器中。使用可执行JAR时不支持JSP
(2)、Undertow不支持JSP。
(3)、创建一个自定义的error.jsp页面不会覆盖默认的错误处理视图。应改为使用自定义错误页 。