🍊
翻译橙
🍊返回主站🤖参与贡献
  • hello,这里是翻译橙
  • spring boot参考文档
    • 1. 法律
    • 2. 寻求帮助
    • 3. 文档概述
    • 4. 入门
    • 5. 升级Spring Boot
    • 6. 使用 Spring Boot 进行开发
      • 6.1. 构建系统
      • 6.2. 构建你的代码
      • 6.3. 配置类
      • 6.4. 自动配置
      • 6.5. Spring Bean 和依赖注入
      • 6.6. 使用@SpringBootApplication注解
      • 6.7. 运行您的应用程序
      • 6.8. 开发者工具
      • 6.9. 打包您的生产应用程序
      • 6.10. 接下来读什么
    • 7.核心特性
      • 7.1. SpringApplication
      • 7.2. 外部化配置
      • 7.3.Profile配置
      • 7.4.日志记录
      • 7.5.国际化
      • 7.6 面向切面的编程
      • 7.7. JSON
      • 7.8. 任务执行与调度
      • 7.9. 单元测试
        • 7.9.1. 测试范围依赖
        • 7.9.2. 测试 Spring 应用程序
        • 7.9.3. 测试 Spring Boot 应用程序
        • 7.9.4. 测试容器
        • 7.9.5. 测试工具
      • 7.10. Docker Compose 支持
      • 7.11. 测试容器支持
      • 7.12. 创建您自己的自动配置
      • 7.13. Kotlin 支持
      • 7.14 SSL
      • 7.15.接下来要读什么
    • 8. 网络
      • 8.1. Servlet Web 应用程序
        • 8.1.1. “Spring Web MVC 框架”
        • 8.1.2. JAX-RS 和Jersey
        • 8.1.3. 嵌入式 Servlet 容器支持
      • 8.2 反应式网络应用程序
        • 8.2.1. “Spring WebFlux 框架”
        • 8.2.2. 嵌入式反应式服务器支持
        • 8.2.3. 反应式服务器资源配置
      • 8.3. 优雅关机
      • 8.4. spring安全
        • 8.4.1. MVC安全
        • 8.4.2. WebFlux 安全
        • 8.4.3. OAuth2
        • 8.4.4. SAML 2.0
      • 8.5. spring 会话
      • 8.6.GraphQL
      • 8.7. Spring HATEOAS
      • 8.8.接下来读什么
    • 9. 数据
      • 9.1. SQL数据库
      • 9.2. 使用 NoSQL 技术
      • 9.3. 接下来读什么
    • 10. 消息
      • 10.1. JMS
      • 10.2. AMQP
      • 10.3. Apache Kafka 支持
      • 10.4. Apache Pulsar 支持
      • 10.5. RSocket
      • 10.6. Spring Integration
      • 10.7. WebSockets
      • 10.8. What to Read Next
    • 11. IO
      • 11.1. 缓存
      • 11.2. Hazelcast
      • 11.3. Quartz 调度程序
      • 11.4. 发送电子邮件
      • 11.5. 验证
      • 11.6. 调用 REST 服务
      • 11.7. web services
      • 11.8. 使用 JTA 进行分布式事务
      • 11.9. 接下来读什么
    • 12. 容器镜像
  • Spring核心功能
    • 1.IOC容器和Bean简介
      • 1.2. 容器概述
      • 1.3. Bean概述
      • 1.4. 依赖项
        • 1.4.1. 依赖注入
        • 1.4.2. 详细的依赖关系和配置
        • 1.4.3. 使用depends-on
        • 1.4.4. 延迟初始化的 Bean
        • 1.4.5. 自动装配协作者
        • 1.4.6. 方法注入
    • 2. Resources
      • 2.1. 介绍
      • 2.2. Resource接口
      • 2.3. 内置Resource实现
      • 2.4. ResourceLoader接口
      • 2.5. ResourcePatternResolver接口
      • 2.6. ResourceLoaderAware接口
      • 2.7. 资源作为依赖
      • 2.8. 应用程序上下文和资源路径
    • 3. 验证、数据绑定和类型转换
      • 3.1. 使用 Spring 的 Validator 接口进行验证
      • 3.2. 将代码解析为错误消息
      • 3.3. Bean 操作和BeanWrapper
      • 3.4. spring类型转换
      • 3.5. spring字段格式
      • 3.6. 配置全局日期和时间格式
      • 3.7. Java Bean 验证
    • 4. SpEL表达式
    • 5. Spring 面向切面编程
      • 5.1. AOP 概念
      • 5.2. Spring AOP 的能力和目标
      • 5.3. AOP 代理
      • 5.4. @AspectJ 支持
        • 5.4.1. 启用@AspectJ 支持
        • 5.4.2. 声明一个切面
        • 5.4.3. 声明切入点
        • 5.4.4. 声明切点
        • 5.4.5. 切面说明
        • 5.4.6. 切面实例化模型
        • 5.4.7. AOP 示例
      • 5.5. 基于模式的 AOP 支持
      • 5.6. 选择要使用的 AOP 声明样式
      • 5.7. 混合切面类型
      • 5.8. 代理机制
      • 5.9. @AspectJ 代理的程序化创建
      • 5.10. 在 Spring 应用程序中使用 AspectJ
      • 5.11.更多资源
    • 6. Spring AOP API
      • 6.1. Spring中的切入点API
      • 6.2. Spring 中的 Advice API
      • 6.3. Spring 中的 Advisor API
      • 6.4. 使用ProxyFactoryBean创建 AOP 代理
      • 6.5. 简洁的代理定义
      • 6.6. 以编程方式创建 AOP 代理ProxyFactory
      • 6.7. 操作切面对象
      • 6.8. 使用“自动代理”工具
      • 6.9. 使用TargetSource实现
      • 6.10. 定义新的切面类型
    • 7. 空指针安全
    • 8. 数据缓冲器和编解码器
    • 9. 日志
    • 10. 附录
      • 10.1. XML 模式
      • 10.2. 自定义XML Schema
        • 10.2.1. 创作 Schema
        • 10.2.2. 编码一个NamespaceHandler
        • 10.2.3. 使用BeanDefinitionParser
        • 10.2.4. 注册处理程序和模式
        • 10.2.5. 在 Spring XML 配置中使用自定义扩展
        • 10.2.6. 更详细的例子
      • 10.3. 应用程序启动步骤
  • 使用redis实现分布式锁
  • Java 安全标准算法名称
  • JDK 9 JEP
  • JDK 10 JEP
  • 人件
    • 《人件》
    • 第一部分 管理人力资源
      • 01 此时此刻,一个项目正在走向失败
      • 02 干酪汉堡,做一个,卖一个
      • 03 维也纳在等你
      • 04 质量——如果时间允许
      • 05 再谈帕金森定律
      • 06 苦杏素
    • 第二部分 办公环境
      • 07 家具警察
      • 08 “朝九晚五在这里啥也完成不了。”
      • 09 在空间上省钱
      • 间奏曲:生产效率度量和不明飞行物
      • 10 大脑时问与身体时间
      • 11 电话
      • 12 门的回归
      • 13 采取保护步骤
    • 第三部分 正确的人
      • 14 霍恩布洛尔因素
      • 15 谈谈领导力
      • 16 雇一名杂耍演员
      • 17 与他人良好合作
      • 18 童年的终结
      • 19 在这儿很开心
      • 20 人力资本
    • 第四部分 高效团队养成
      • 21 整体大于部分之和
      • 22 黑衣团队
      • 23 团队自毁
      • 24 再谈团队自毁
      • 25 竞争
      • 26 一顿意面晚餐
      • 27 敞开和服
      • 28 团队形成的化学反应
    • 第五部分 沃土
      • 29 自我愈复系统
      • 30 与风险共舞
      • 3l 会议、独白和交流
      • 32 终极管理罪恶得主是……
      • 33 “邪恶”电邮
      • 34 让改变成为可能
      • 35 组织型学习
      • 36 构建社区
    • 第六部分 快乐地工作
      • 37 混乱与秩序
      • 38 自由电子
      • 39 霍尔加·丹斯克
由 GitBook 提供支持
在本页

这有帮助吗?

在GitHub上编辑
  1. spring boot参考文档
  2. 8. 网络
  3. 8.1. Servlet Web 应用程序

8.1.3. 嵌入式 Servlet 容器支持

上一页8.1.2. JAX-RS 和Jersey下一页8.2 反应式网络应用程序

最后更新于1年前

这有帮助吗?

、和服务器的支持。大多数开发人员使用适当的“Starter”来获取完全配置的实例。默认情况下,嵌入式服务器侦听端口 8080上的 HTTP 请求。

Servlet、过滤器和侦听器

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

将 Servlet、过滤器和侦听器注册为 Spring Bean

任何属于Spring bean 的Servlet、Filter、 或 servlet*Listener实例都注册到嵌入式容器中。如果您想在配置期间引用application.properties中的值,这会特别方便。

默认情况下,如果上下文仅包含单个 Servlet,则它将映射到/. 对于多个 servlet bean,bean 名称用作路径前缀。过滤器映射到/*.

如果基于约定的映射不够灵活,您可以使用ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean类进行完全控制。

通常,让filter bean保持无序状态是安全的。如果需要特定的顺序,您应该使用@Order注释Filter或使其实现Ordered。您不能通过使用@Order 注释其 bean 方法来配置Filter 的顺序。如果您无法为Filter添加@Order或实现的类Ordered,则必须为Filter定义FilterRegistrationBean并使用 setOrder(int)方法设置注册 bean 的顺序。避免配置在 Ordered.HIGHEST_PRECEDENCE 处读取请求正文的过滤器,因为它可能会违反应用程序的字符编码配置。如果 servlet 过滤器包装请求,则应配置小于或等于 OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER 的顺序。

要查看应用程序中 每个 Filter项的顺序,请为web ( logging.level.web=debug) 启用调试级别日志记录。已注册过滤器的详细信息(包括它们的顺序和 URL 模式)将在启动时记录下来。

注册Filter bean 时要小心,因为它们是在应用程序生命周期的早期初始化的。如果您需要注册Filter与其他 bean 交互,请考虑使用 来代替。

Servlet 上下文初始化

嵌入式servlet容器不直接执行jakarta.servlet.ServletContainerInitializer接口或Spring的org.springframework.web.WebApplicationInitializer接口。这是一个有意的设计决策,旨在降低设计用于在战争中运行的第三方库可能破坏 Spring Boot 应用程序的风险。

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

扫描 Servlet、过滤器和侦听器

使用嵌入式容器时,可以使用 @ServletComponentScan启用自动注册用@WebServlet、@WebFilter、 和@WebListener注释的类。

@ServletComponentScan在独立容器中没有效果,由于它使用容器的内置发现机制。

ServletWebServerApplicationContext

在底层,Spring Boot 使用不同类型的ApplicationContext提供嵌入式 servlet 容器支持。ServletWebServerApplicationContext是一种特殊类型WebApplicationContext,它通过搜索单个ServletWebServerFactorybean 来引导自身。通常TomcatServletWebServerFactory、JettyServletWebServerFactory、 或UndertowServletWebServerFactory都会被自动配置。

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

在嵌入式容器设置中,ServletContext被设置为服务器启动的一部分,该启动在应用程序上下文初始化期间发生。因此,ApplicationContext不能使用 ServletContext初始化中的 beans 。解决这个问题的一种方法是ApplicationContext作为 bean 的依赖项注入并ServletContext仅在需要时访问。另一种方法是在服务器启动后使用回调。这可以使用ApplicationListener监听ApplicationStartedEvent来完成,如下所示:

public class MyDemoBean implements ApplicationListener<ApplicationStartedEvent> {
​
    private ServletContext servletContext;
​
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        ApplicationContext applicationContext = event.getApplicationContext();
        this.servletContext = ((WebApplicationContext) applicationContext).getServletContext();
    }
​
}

自定义嵌入式 Servlet 容器

常见的 servlet 容器设置可以使用 SpringEnvironment属性进行配置。通常,您可以在您的application.properties或application.yaml文件中定义属性。

常见的服务器设置包括:

  • 网络设置:传入 HTTP 请求的侦听端口 ( server.port)、要绑定的接口地址 ( server.address) 等。

  • 会话设置:会话是否持久 ( server.servlet.session.persistent)、会话超时 ( server.servlet.session.timeout)、会话数据位置 ( server.servlet.session.store-dir) 和会话 cookie 配置 ( server.servlet.session.cookie.*)。

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

同站点 Cookie

Web 浏览器可以使用cookie属性SameSite来控制在跨站点请求中是否提交 cookie 以及如何提交。该属性与现代 Web 浏览器特别相关,现代 Web 浏览器已开始更改该属性丢失时使用的默认值。

如果您想更改会话 cookie 的SameSite属性,可以使用server.servlet.session.cookie.same-site属性。自动配置的 Tomcat、Jetty 和 Undertow 服务器支持此属性。它还用于配置基于 Spring Session servlet 的SessionRepositorybean。

例如,如果您希望会话 cookie 具有None值的SameSite属性,您可以将以下内容添加到您的application.properties或application.yaml文件中:

server.servlet.session.cookie.same-site=none

如果您想更改SameSite添加到您的其他 cookie 上的属性HttpServletResponse,您可以使用CookieSameSiteSupplier. CookieSameSiteSupplier传递 a并Cookie可能返回一个SameSite值,或null。

您可以使用许多便利的工厂和过滤器方法来快速匹配特定的 cookie。例如,添加以下 bean 将自动为名称与正则表达式 myapp.*匹配的所有cookie应用 Lax的 SameSite。

@Configuration(proxyBeanMethods = false)
public class MySameSiteConfiguration {
​
    @Bean
    public CookieSameSiteSupplier applicationCookieSameSiteSupplier() {
        return CookieSameSiteSupplier.ofLax().whenHasNameMatching("myapp.*");
    }
​
}

字符编码

可以使用配置server.servlet.encoding.*属性来配置用于请求和响应处理的嵌入式 Servlet 容器的字符编码行为。

当请求的Accept-Language标头指示请求的区域设置时,servlet 容器将自动将其映射到字符集。每个容器都提供默认区域设置到字符集映射,您应该验证它们是否满足您的应用程序的需求。如果不存在,请使用server.servlet.encoding.mapping配置属性来自定义映射,如以下示例所示:

server.servlet.encoding.mapping.ko=UTF-8

在前面的示例中,ko(韩语)区域设置已映射到UTF-8. 这相当于传统war部署文件web.xml中的<locale-encoding-mapping-list>条目。

程序化定制

如果您需要以编程方式配置嵌入式 servlet 容器,您可以注册一个实现WebServerFactoryCustomizer接口的 Spring bean。 WebServerFactoryCustomizer提供对ConfigurableServletWebServerFactory 的访问,其中包括许多自定义设置器方法。以下示例显示以编程方式设置端口:

@Component
public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
​
    @Override
    public void customize(ConfigurableServletWebServerFactory server) {
        server.setPort(9000);
    }
​
}

TomcatServletWebServerFactory、JettyServletWebServerFactory和UndertowServletWebServerFactory是其专用变体,ConfigurableServletWebServerFactory分别为 Tomcat、Jetty 和 Undertow 提供额外的自定义 setter 方法。以下示例显示如何进行自定义TomcatServletWebServerFactory以提供对特定于 Tomcat 的配置选项的访问:

@Component
public class MyTomcatWebServerFactoryCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
​
    @Override
    public void customize(TomcatServletWebServerFactory server) {
        server.addConnectorCustomizers((connector) -> connector.setAsyncTimeout(Duration.ofSeconds(20).toMillis()));
    }
​
}

直接自定义 ConfigurableServletWebServerFactory

对于需要从 扩展的更高级用例ServletWebServerFactory,您可以自己公开此类类型的 bean。

自动配置的定制器仍然应用于您的定制工厂,因此请谨慎使用该选项。

JSP 限制

当运行使用嵌入式 servlet 容器(并打包为可执行存档)的 Spring Boot 应用程序时,JSP 支持存在一些限制。

  • 对于 Jetty 和 Tomcat,如果您使用 war 包装,它应该可以工作。可执行的 war 在使用java -jar 启动时可以工作,并且也可以部署到任何标准容器。使用可执行 jar 时不支持 JSP。

  • Undertow 不支持 JSP。

Spring Boot 尝试尽可能多地公开通用设置,但这并不总是可行。对于这些情况,专用命名空间提供特定于服务器的自定义(请参阅server.tomcat和server.undertow)。例如,可以使用嵌入式 servlet 容器的特定功能来配置

请参阅课程以获取完整列表。

为许多配置选项提供了设置器。如果您需要做一些更奇特的事情,还提供了几个受保护的方法“挂钩”。详细信息请参见

创建自定义error.jsp页面不会覆盖的默认视图。 应改用

对于 servlet 应用程序,Spring Boot 包括对嵌入式Tomcat
Jetty
Undertow
日志记录组
DelegatingFilterProxyRegistrationBean
SSL协议
HTTP 压缩
访问日志。
ServerProperties
源代码文档。
错误处理
自定义错误页面。