此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4spring-doc.cn

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4spring-doc.cn

每个 Spring Boot Web 应用程序都包含一个嵌入式 Web 服务器。 此功能会导致许多操作问题,包括如何更改嵌入式服务器以及如何配置嵌入式服务器。 本节将回答这些问题。spring-doc.cn

使用其他 Web 服务器

许多 Spring Boot Starters包括默认的嵌入式容器。spring-doc.cn

  • 对于 servlet 堆栈应用程序,通过 include 来包含 Tomcat,但您可以改用 or。spring-boot-starter-webspring-boot-starter-tomcatspring-boot-starter-jettyspring-boot-starter-undertowspring-doc.cn

  • 对于反应式堆栈应用程序,它通过包含 、 来包含 Reactor Netty,但你可以使用 、 或 代替。spring-boot-starter-webfluxspring-boot-starter-reactor-nettyspring-boot-starter-tomcatspring-boot-starter-jettyspring-boot-starter-undertowspring-doc.cn

切换到其他 HTTP 服务器时,您需要将默认依赖项交换为所需的依赖项。 为了帮助完成此过程, Spring Boot 为每个受支持的 HTTP 服务器提供了一个单独的Starters。spring-doc.cn

下面的 Maven 示例展示了如何排除 Tomcat 并包括 Jetty for Spring MVC:spring-doc.cn

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<!-- Exclude the Tomcat dependency -->
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

下面的 Gradle 示例配置了必要的依赖项和模块替换,以使用 Undertow 代替 Spring WebFlux 的 Reactor Netty:spring-doc.cn

dependencies {
	implementation "org.springframework.boot:spring-boot-starter-undertow"
	implementation "org.springframework.boot:spring-boot-starter-webflux"
	modules {
		module("org.springframework.boot:spring-boot-starter-reactor-netty") {
			replacedBy("org.springframework.boot:spring-boot-starter-undertow", "Use Undertow instead of Reactor Netty")
		}
	}
}
spring-boot-starter-reactor-netty是必须使用该类的,因此即使需要包含不同的 HTTP 服务器,也可能需要保持对 Netty 的依赖。WebClient
spring-boot-starter-reactor-netty是必须使用该类的,因此即使需要包含不同的 HTTP 服务器,也可能需要保持对 Netty 的依赖。WebClient

禁用 Web 服务器

如果你的 Classpath 包含启动 Web 服务器所需的位,Spring Boot 将自动启动它。 要禁用此行为,请在 中配置 ,如以下示例所示:WebApplicationTypeapplication.propertiesspring-doc.cn

spring.main.web-application-type=none
spring:
  main:
    web-application-type: "none"

更改 HTTP 端口

在独立应用程序中,主 HTTP 端口默认为,但可以使用 (例如,in 或 as a System 属性) 进行设置。 由于值的松散绑定,您还可以使用 (例如,作为 OS 环境变量)。8080server.portapplication.propertiesEnvironmentSERVER_PORTspring-doc.cn

要完全关闭 HTTP 端点,但仍创建 , use(这样做有时对测试很有用)。WebApplicationContextserver.port=-1spring-doc.cn

有关更多详细信息,请参见“Spring Boot 功能”部分中的自定义嵌入式 Servlet 容器,或该类。ServerPropertiesspring-doc.cn

使用随机未分配的 HTTP 端口

要扫描空闲端口(使用 OS 本机来防止冲突),请使用 .server.port=0spring-doc.cn

在运行时发现 HTTP 端口

您可以从日志输出或通过其 访问运行服务器的端口。 获取该容器并确保其已初始化的最佳方法是添加 of 类型,并在发布事件时将容器从事件中拉出。WebServerApplicationContextWebServer@BeanApplicationListener<WebServerInitializedEvent>spring-doc.cn

使用注释的测试还可以使用注释将实际端口注入到字段中,如以下示例所示:@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)@LocalServerPortspring-doc.cn

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.server.LocalServerPort;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyWebIntegrationTests {

	@LocalServerPort
	int port;

	// ...

}
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.boot.test.web.server.LocalServerPort

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyWebIntegrationTests {

	@LocalServerPort
	var port = 0

	// ...

}

@LocalServerPort是 的元批注。 请勿尝试在常规应用程序中注入端口。 正如我们刚才看到的,只有在初始化容器后才会设置该值。 与测试相反,应用程序代码回调会提前处理(在值实际可用之前)。@Value("${local.server.port}")spring-doc.cn

@LocalServerPort是 的元批注。 请勿尝试在常规应用程序中注入端口。 正如我们刚才看到的,只有在初始化容器后才会设置该值。 与测试相反,应用程序代码回调会提前处理(在值实际可用之前)。@Value("${local.server.port}")spring-doc.cn

启用 HTTP 响应压缩

Jetty、Tomcat、Reactor Netty 和 Undertow 支持 HTTP 响应压缩。 可以在 中启用它,如下所示:application.propertiesspring-doc.cn

server.compression.enabled=true
server:
  compression:
    enabled: true

默认情况下,响应的长度必须至少为 2048 字节才能执行压缩。 您可以通过设置属性来配置此行为。server.compression.min-response-sizespring-doc.cn

默认情况下,仅当响应的内容类型为以下之一时,才会压缩响应:spring-doc.cn

您可以通过设置属性来配置此行为。server.compression.mime-typesspring-doc.cn

配置 SSL

可以通过设置各种属性(通常在 或 中)以声明方式配置 SSL。 有关所有受支持属性的详细信息,请参阅。server.ssl.*application.propertiesapplication.yamlSslspring-doc.cn

以下示例显示了使用 Java KeyStore 文件设置 SSL 属性:spring-doc.cn

server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
server.ssl.key-password=another-secret
server:
  port: 8443
  ssl:
    key-store: "classpath:keystore.jks"
    key-store-password: "secret"
    key-password: "another-secret"

使用如上例所示的配置意味着应用程序不再支持端口 8080 上的纯 HTTP 连接器。 Spring Boot 不支持通过 HTTP 连接器和 HTTPS 连接器的配置。 如果要同时拥有两者,则需要以编程方式配置其中一个。 我们建议使用 来配置 HTTPS,因为 HTTP 连接器是两者中更容易以编程方式配置的。application.propertiesapplication.propertiesspring-doc.cn

使用 PEM 编码的文件

您可以使用 PEM 编码的文件,而不是 Java KeyStore 文件。 您应该尽可能使用 PKCS#8 密钥文件。 PEM 编码的 PKCS#8 密钥文件以 or 标头开头。-----BEGIN PRIVATE KEY----------BEGIN ENCRYPTED PRIVATE KEY-----spring-doc.cn

如果您有其他格式的文件,例如 PKCS#1 () 或 SEC 1 (),您可以使用 OpenSSL 将它们转换为 PKCS#8:-----BEGIN RSA PRIVATE KEY----------BEGIN EC PRIVATE KEY-----spring-doc.cn

openssl pkcs8 -topk8 -nocrypt -in <input file> -out <output file>

以下示例显示了使用 PEM 编码的证书和私钥文件设置 SSL 属性:spring-doc.cn

server.port=8443
server.ssl.certificate=classpath:my-cert.crt
server.ssl.certificate-private-key=classpath:my-cert.key
server.ssl.trust-certificate=classpath:ca-cert.crt
server:
  port: 8443
  ssl:
    certificate: "classpath:my-cert.crt"
    certificate-private-key: "classpath:my-cert.key"
    trust-certificate: "classpath:ca-cert.crt"

使用 SSL 捆绑包

或者,可以在 SSL 捆绑包中配置 SSL 信任材料并应用于 Web 服务器,如以下示例所示:spring-doc.cn

server.port=8443
server.ssl.bundle=example
server:
  port: 8443
  ssl:
    bundle: "example"
该属性不能与 下的 discrete Java KeyStore 或 PEM 属性选项结合使用。server.ssl.bundleserver.ssl

配置服务器名称指示

Tomcat、Netty 和 Undertow 可以配置为对单个主机名使用唯一的 SSL 信任材料,以支持服务器名称指示 (SNI)。 Jetty 不支持 SNI 配置,但如果提供了多个证书,Jetty 可以自动设置 SNIspring-doc.cn

假设已配置了名为 、 和 的 SSL 捆绑包,则可以使用以下配置将每个捆绑包分配给由嵌入式 Web 服务器提供的主机名:webweb-alt1web-alt2spring-doc.cn

server.port=8443
server.ssl.bundle=web
server.ssl.server-name-bundles[0].server-name=alt1.example.com
server.ssl.server-name-bundles[0].bundle=web-alt1
server.ssl.server-name-bundles[1].server-name=alt2.example.com
server.ssl.server-name-bundles[1].bundle=web-alt2
server:
  port: 8443
  ssl:
    bundle: "web"
    server-name-bundles:
      - server-name: "alt1.example.com"
        bundle: "web-alt1"
      - server-name: "alt2.example.com"
        bundle: "web-alt2"

指定的捆绑包将用于默认主机以及支持 SNI 的任何客户端。 如果配置了任何捆绑包,则必须配置此默认捆绑包。server.ssl.bundleserver.ssl.server-name-bundlesspring-doc.cn

该属性不能与 下的 discrete Java KeyStore 或 PEM 属性选项结合使用。server.ssl.bundleserver.ssl

配置 HTTP/2

您可以使用 configuration 属性在 Spring Boot 应用程序中启用 HTTP/2 支持。 (基于 TLS 的 HTTP/2)和(基于 TCP 的 HTTP/2)均受支持。 要使用 ,还必须启用 SSL。 如果未启用 SSL 时,将使用 SSL。 例如,您可能希望在应用程序在执行 TLS 终止的代理服务器后面运行时使用。server.http2.enabledh2h2ch2h2ch2cspring-doc.cn

使用 Tomcat 的 HTTP/2

Spring Boot 默认附带 Tomcat 10.1.x,它支持并且开箱即用。 或者,如果库及其依赖项安装在主机操作系统上,则可以使用 for support。h2ch2libtcnativeh2spring-doc.cn

库目录必须可用于 JVM 库路径(如果尚未可用)。 您可以使用 JVM 参数(如 . 更多相关信息,请参阅 Tomcat 官方文档-Djava.library.path=/usr/local/opt/tomcat-native/libspring-doc.cn

使用 Jetty 的 HTTP/2

对于 HTTP/2 支持,Jetty 需要额外的依赖项。 要使用,不需要其他依赖项。 要使用 ,您还需要根据您的部署选择以下依赖项之一:org.eclipse.jetty.http2:jetty-http2-serverh2ch2spring-doc.cn

使用 Reactor Netty 的 HTTP/2

默认情况下,它使用 Reactor Netty 作为服务器。 Reactor Netty 支持且开箱即用。 为了实现最佳的运行时性能,此服务器还支持本机库。 要启用此功能,您的应用程序需要具有额外的依赖项。spring-boot-webflux-starterh2ch2h2spring-doc.cn

Spring Boot 管理“uber jar”的版本,其中包含所有平台的本机库。 开发人员可以选择使用分类器仅导入所需的依赖项(参见 Netty 官方文档)。io.netty:netty-tcnative-boringssl-staticspring-doc.cn

使用 Undertow 的 HTTP/2

Undertow 支架和开箱即用。h2ch2spring-doc.cn

配置 Web 服务器

通常,您应该首先考虑使用众多可用配置键之一,并通过在 or 文件中添加新条目来自定义您的 Web 服务器。 请参阅发现外部属性的内置选项)。 命名空间在这里非常有用,它包括像 、 和其他命名空间,用于特定于服务器的功能。 请参阅通用应用程序属性列表。application.propertiesapplication.yamlserver.*server.tomcat.*server.jetty.*spring-doc.cn

前面的部分已经涵盖了许多常见使用案例,例如压缩、SSL 或 HTTP/2。 但是,如果您的使用案例不存在配置键,则应查看 。 您可以声明这样的组件并访问与您选择的相关的服务器工厂:您应该为所选服务器(Tomcat、Jetty、Reactor Netty、Undertow)和所选的 Web 堆栈(servlet 或 reactive)选择变体。WebServerFactoryCustomizerspring-doc.cn

以下示例适用于具有 (servlet 堆栈) 的 Tomcat:spring-boot-starter-webspring-doc.cn

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

@Component
public class MyTomcatWebServerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

	@Override
	public void customize(TomcatServletWebServerFactory factory) {
		// customize the factory here
	}

}
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
import org.springframework.boot.web.server.WebServerFactoryCustomizer
import org.springframework.stereotype.Component

@Component
class MyTomcatWebServerCustomizer : WebServerFactoryCustomizer<TomcatServletWebServerFactory?> {

	override fun customize(factory: TomcatServletWebServerFactory?) {
		// customize the factory here
	}

}
Spring Boot 在内部使用该基础结构来自动配置服务器。 自动配置的 bean 具有 order of 并将在任何用户定义的定制器之前进行处理,除非它具有明确的顺序,另有说明。WebServerFactoryCustomizer0

使用定制器访问 后,您可以使用它来配置特定部分,例如连接器、服务器资源或服务器本身 - 所有这些都使用特定于服务器的 API。WebServerFactoryspring-doc.cn

此外,Spring Boot 还提供:spring-doc.cn

服务器 Servlet 堆栈 反应式堆栈

Tomcatspring-doc.cn

TomcatServletWebServerFactoryspring-doc.cn

TomcatReactiveWebServerFactoryspring-doc.cn

Jettyspring-doc.cn

JettyServletWebServerFactoryspring-doc.cn

JettyReactiveWebServerFactoryspring-doc.cn

Undertowspring-doc.cn

UndertowServletWebServerFactoryspring-doc.cn

UndertowReactiveWebServerFactoryspring-doc.cn

反应器spring-doc.cn

不适用spring-doc.cn

NettyReactiveWebServerFactoryspring-doc.cn

作为最后的手段,您还可以声明自己的 bean,这将覆盖 Spring Boot 提供的 bean。 执行此操作时,自动配置的定制器仍会应用于您的自定义工厂,因此请谨慎使用该选项。WebServerFactoryspring-doc.cn

Spring Boot 在内部使用该基础结构来自动配置服务器。 自动配置的 bean 具有 order of 并将在任何用户定义的定制器之前进行处理,除非它具有明确的顺序,另有说明。WebServerFactoryCustomizer0
服务器 Servlet 堆栈 反应式堆栈

Tomcatspring-doc.cn

TomcatServletWebServerFactoryspring-doc.cn

TomcatReactiveWebServerFactoryspring-doc.cn

Jettyspring-doc.cn

JettyServletWebServerFactoryspring-doc.cn

JettyReactiveWebServerFactoryspring-doc.cn

Undertowspring-doc.cn

UndertowServletWebServerFactoryspring-doc.cn

UndertowReactiveWebServerFactoryspring-doc.cn

反应器spring-doc.cn

不适用spring-doc.cn

NettyReactiveWebServerFactoryspring-doc.cn

向应用程序添加 Servlet、Filter 或 Listener

在 Servlet 堆栈应用程序中,即使用 ,有两种方法可以将 、 、 以及 Servlet API 支持的其他侦听器添加到应用程序中:spring-boot-starter-webServletFilterServletContextListenerspring-doc.cn

使用 Spring Bean 添加 Servlet、Filter 或 Listener

要使用 Spring Bean 添加 、 或 Servlet,必须为其提供定义。 当您想要注入配置或依赖项时,这样做可能非常有用。 但是,您必须非常小心,不要让它们引起太多其他 bean 的急切初始化,因为它们必须在应用程序生命周期的早期就安装在容器中。 (例如,让它们依赖于 your 或 JPA 配置不是一个好主意。 您可以通过在首次使用时而不是在初始化时延迟初始化 bean 来解决此类限制。ServletFilter*Listener@BeanDataSourcespring-doc.cn

对于过滤器和 Servlet,您还可以通过添加 a 或 a 来添加映射和 init 参数,而不是底层组件,或者添加底层组件。FilterRegistrationBeanServletRegistrationBeanspring-doc.cn

如果未在筛选器注册上指定 no,则使用 。 这与 Servlet 规范的默认 dispatcher 类型一致。dispatcherTypeREQUESTspring-doc.cn

与任何其他 Spring bean 一样,您可以定义 servlet 过滤器 bean 的顺序;请确保检查 Registering Servlets, Filters, and Listeners as Spring Beans 部分。spring-doc.cn

禁用 Servlet 或过滤器的注册

如前所述,任何 或 bean 都会自动注册到 servlet 容器中。 要禁用特定 bean 或 bean 的注册,请为其创建一个注册 bean 并将其标记为已禁用,如以下示例所示:ServletFilterFilterServletspring-doc.cn

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class MyFilterConfiguration {

	@Bean
	public FilterRegistrationBean<MyFilter> registration(MyFilter filter) {
		FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(filter);
		registration.setEnabled(false);
		return registration;
	}

}
import org.springframework.boot.web.servlet.FilterRegistrationBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration(proxyBeanMethods = false)
class MyFilterConfiguration {

	@Bean
	fun registration(filter: MyFilter): FilterRegistrationBean<MyFilter> {
		val registration = FilterRegistrationBean(filter)
		registration.isEnabled = false
		return registration
	}

}

使用 Classpath 扫描添加 Servlet、过滤器和侦听器

@WebServlet、 和 带注释的类可以自动注册到嵌入式 servlet 容器中,方法是用 要注册的组件 对类进行注释并指定包。 默认情况下,从带注释的类的包中扫描。@WebFilter@WebListener@Configuration@ServletComponentScan@ServletComponentScanspring-doc.cn

如果未在筛选器注册上指定 no,则使用 。 这与 Servlet 规范的默认 dispatcher 类型一致。dispatcherTypeREQUESTspring-doc.cn

配置访问日志记录

可以通过 Tomcat、Undertow 和 Jetty 各自的命名空间为 Tomcat、Undertow 和 Jetty 配置访问日志。spring-doc.cn

例如,以下设置使用自定义模式记录对 Tomcat 的访问。spring-doc.cn

server.tomcat.basedir=my-tomcat
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%t %a %r %s (%D microseconds)
server:
  tomcat:
    basedir: "my-tomcat"
    accesslog:
      enabled: true
      pattern: "%t %a %r %s (%D microseconds)"
日志的默认位置是相对于 Tomcat 基目录的目录。 默认情况下,该目录是一个临时目录,因此您可能需要修复 Tomcat 的基目录或使用日志的绝对路径。 在前面的示例中,日志相对于应用程序的工作目录可用。logslogsmy-tomcat/logs

Undertow 的访问日志记录可以采用类似的方式进行配置,如以下示例所示:spring-doc.cn

server.undertow.accesslog.enabled=true
server.undertow.accesslog.pattern=%t %a %r %s (%D milliseconds)
server.undertow.options.server.record-request-start-time=true
server:
  undertow:
    accesslog:
      enabled: true
      pattern: "%t %a %r %s (%D milliseconds)"
    options:
      server:
        record-request-start-time: true

请注意,除了启用访问日志记录和配置其模式之外,还启用了记录请求开始时间。 在访问日志模式中包含响应时间 () 时,这是必需的。 日志存储在相对于应用程序工作目录的目录中。 您可以通过设置属性来自定义此位置。%Dlogsserver.undertow.accesslog.dirspring-doc.cn

最后,Jetty 的访问日志记录也可以按如下方式配置:spring-doc.cn

server.jetty.accesslog.enabled=true
server.jetty.accesslog.filename=/var/log/jetty-access.log
server:
  jetty:
    accesslog:
      enabled: true
      filename: "/var/log/jetty-access.log"

默认情况下,日志将重定向到 。 有关更多详细信息,请参阅 Jetty 文档。System.errspring-doc.cn

日志的默认位置是相对于 Tomcat 基目录的目录。 默认情况下,该目录是一个临时目录,因此您可能需要修复 Tomcat 的基目录或使用日志的绝对路径。 在前面的示例中,日志相对于应用程序的工作目录可用。logslogsmy-tomcat/logs

在前端代理服务器后面运行

如果您的应用程序在代理、负载均衡器或云中运行,则请求信息(如主机、端口、方案等)可能会在此过程中发生变化。 您的应用程序可能正在 上运行,但 HTTP 客户端应该只能看到 。10.10.10.10:8080example.orgspring-doc.cn

RFC7239 “Forwarded Headers” 定义 HTTP 标头;代理可以使用此标头提供有关原始请求的信息。 您可以将应用程序配置为读取这些标头,并在创建链接并将其发送到 HTTP 302 响应、JSON 文档或 HTML 页面中的客户端时自动使用该信息。 还有非标准标头,如 、 和 。ForwardedX-Forwarded-HostX-Forwarded-PortX-Forwarded-ProtoX-Forwarded-SslX-Forwarded-Prefixspring-doc.cn

如果代理添加了常用的 and 标头,则设置为 to 就足以支持这些标头。 使用此选项,Web 服务器本身本身支持此功能;您可以查看他们的特定文档以了解特定行为。X-Forwarded-ForX-Forwarded-Protoserver.forward-headers-strategyNATIVEspring-doc.cn

如果这还不够,Spring 框架为 servlet 堆栈提供了一个ForwardedHeaderFilter,为反应堆栈提供了一个ForwardedHeaderTransformer。 您可以通过设置为 在应用程序中使用它们。server.forward-headers-strategyFRAMEWORKspring-doc.cn

如果使用 Tomcat 并在代理处终止 SSL,则应将其设置为 。 这允许在执行任何重定向之前遵守标头。server.tomcat.redirect-context-rootfalseX-Forwarded-Proto
如果应用程序运行 ,则该属性默认为 。 在所有其他实例中,它默认为 .in a supported Cloud Platformserver.forward-headers-strategyNATIVENONE

自定义 Tomcat 的代理配置

如果使用 Tomcat,还可以配置用于携带“转发”信息的标头的名称,如以下示例所示:spring-doc.cn

server.tomcat.remoteip.remote-ip-header=x-your-remote-ip-header
server.tomcat.remoteip.protocol-header=x-your-protocol-header
server:
  tomcat:
    remoteip:
      remote-ip-header: "x-your-remote-ip-header"
      protocol-header: "x-your-protocol-header"

Tomcat 还配置了一个正则表达式,该表达式与要信任的内部代理匹配。 有关其默认值,请参阅附录中的 server.tomcat.remoteip.internal-proxies 条目。 您可以通过向 中添加条目来自定义阀的配置,如以下示例所示:application.propertiesspring-doc.cn

server.tomcat.remoteip.internal-proxies=192\.168\.\d{1,3}\.\d{1,3}
server:
  tomcat:
    remoteip:
      internal-proxies: "192\\.168\\.\\d{1,3}\\.\\d{1,3}"
您可以通过将 设置为 empty 来信任所有代理(但在 production 中不要这样做)。internal-proxies

您可以通过关闭自动配置(为此,请设置 )并使用 bean 添加新的 Valve 实例来完全控制 Tomcat 的配置。RemoteIpValveserver.forward-headers-strategy=NONEWebServerFactoryCustomizerspring-doc.cn

如果使用 Tomcat 并在代理处终止 SSL,则应将其设置为 。 这允许在执行任何重定向之前遵守标头。server.tomcat.redirect-context-rootfalseX-Forwarded-Proto
如果应用程序运行 ,则该属性默认为 。 在所有其他实例中,它默认为 .in a supported Cloud Platformserver.forward-headers-strategyNATIVENONE
您可以通过将 设置为 empty 来信任所有代理(但在 production 中不要这样做)。internal-proxies

使用 Tomcat 启用多个连接器

您可以向 添加 ,这样可以允许多个连接器,包括 HTTP 和 HTTPS 连接器,如以下示例所示:org.apache.catalina.connector.ConnectorTomcatServletWebServerFactoryspring-doc.cn

import org.apache.catalina.connector.Connector;

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class MyTomcatConfiguration {

	@Bean
	public WebServerFactoryCustomizer<TomcatServletWebServerFactory> connectorCustomizer() {
		return (tomcat) -> tomcat.addAdditionalTomcatConnectors(createConnector());
	}

	private Connector createConnector() {
		Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
		connector.setPort(8081);
		return connector;
	}

}
import org.apache.catalina.connector.Connector
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
import org.springframework.boot.web.server.WebServerFactoryCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration(proxyBeanMethods = false)
class MyTomcatConfiguration {

	@Bean
	fun connectorCustomizer(): WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
		return WebServerFactoryCustomizer { tomcat: TomcatServletWebServerFactory ->
			tomcat.addAdditionalTomcatConnectors(
				createConnector()
			)
		}
	}

	private fun createConnector(): Connector {
		val connector = Connector("org.apache.coyote.http11.Http11NioProtocol")
		connector.port = 8081
		return connector
	}

}

启用 Tomcat 的 MBean 注册表

默认情况下,Embedded Tomcat 的 MBean 注册表处于禁用状态。 这样可以最大程度地减少 Tomcat 的内存占用。 例如,如果要使用 Tomcat 的 MBean,以便 Micrometer 可以使用它们来公开度量,则必须使用该属性来执行此操作,如以下示例所示:server.tomcat.mbeanregistry.enabledspring-doc.cn

server.tomcat.mbeanregistry.enabled=true
server:
  tomcat:
    mbeanregistry:
      enabled: true

使用 Undertow 启用多个侦听器

向 添加 ,并向 添加侦听器,如以下示例所示:UndertowBuilderCustomizerUndertowServletWebServerFactoryBuilderspring-doc.cn

import io.undertow.Undertow.Builder;

import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class MyUndertowConfiguration {

	@Bean
	public WebServerFactoryCustomizer<UndertowServletWebServerFactory> undertowListenerCustomizer() {
		return (factory) -> factory.addBuilderCustomizers(this::addHttpListener);
	}

	private Builder addHttpListener(Builder builder) {
		return builder.addHttpListener(8080, "0.0.0.0");
	}

}
import io.undertow.Undertow
import org.springframework.boot.web.embedded.undertow.UndertowBuilderCustomizer
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory
import org.springframework.boot.web.server.WebServerFactoryCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration(proxyBeanMethods = false)
class MyUndertowConfiguration {

	@Bean
	fun undertowListenerCustomizer(): WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
		return WebServerFactoryCustomizer { factory: UndertowServletWebServerFactory ->
			factory.addBuilderCustomizers(
				UndertowBuilderCustomizer { builder: Undertow.Builder -> addHttpListener(builder) })
		}
	}

	private fun addHttpListener(builder: Undertow.Builder): Undertow.Builder {
		return builder.addHttpListener(8080, "0.0.0.0")
	}

}

使用 @ServerEndpoint 创建 WebSocket 终端节点

如果要在使用嵌入式容器的 Spring Boot 应用程序中使用,则必须声明单个,如以下示例所示:@ServerEndpointServerEndpointExporter@Beanspring-doc.cn

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration(proxyBeanMethods = false)
public class MyWebSocketConfiguration {

	@Bean
	public ServerEndpointExporter serverEndpointExporter() {
		return new ServerEndpointExporter();
	}

}
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.socket.server.standard.ServerEndpointExporter

@Configuration(proxyBeanMethods = false)
class MyWebSocketConfiguration {

	@Bean
	fun serverEndpointExporter(): ServerEndpointExporter {
		return ServerEndpointExporter()
	}

}

前面示例中显示的 bean 将任何带注释的 bean 注册到底层 WebSocket 容器。 当部署到独立的 servlet 容器时,此角色由 servlet 容器初始值设定项执行,并且不需要 bean。@ServerEndpointServerEndpointExporterspring-doc.cn