余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

SpringBoot嵌入式容器详细介绍

xiyangw 2023-09-28 15:02 37 浏览 0 评论

环境:Springboot2.5.13


概述

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

默认引入下面依赖使用Tomcat服务器

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

如需要使用其它如Undertow作为服务器只需要如下依赖即可

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

Servlets, Filters, and listeners

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

Registering Servlets, Filters, and Listeners as Spring Beans

任何Spring bean的Servlet、Filter或 *Listener实例都注册到嵌入式容器中。如果你想从应用程序中引用一个值,这可能特别方便。配置过程中的属性。

默认情况下,如果上下文只包含单个Servlet,则将其映射到/。在有多个servlet bean的情况下,bean名用作路径前缀。Filter映射到/*。

如果基于约定的映射不够灵活,可以使用ServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBean类进行完全控制。

通常情况下,将Filter Bean放置无序是安全的。如果需要特定的顺序,则应该使用@Order注释过滤器,或者让它实现Ordered你不能通过给过滤器的bean方法加上@Order注解来配置它的顺序。如果不能更改过滤器类以添加@Order或实现Ordered,则必须为过滤器定义一个FilterRegistrationBean,并使用setOrder(int)方法设置注册bean的订单。避免配置按顺序读取请求体的过滤器。

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

Servlet Context Initialization

嵌入式servlet容器不会直接执行servlet 3.0+ javax.servlet.ServletContainerInitializer接口或Spring的org.springframework.web.WebApplicationInitializer接口。这样做是有意为之,目的是降低在war中运行的第三方库破坏Spring Boot应用程序的风险。

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

扫描 Servlets, Filters, and listeners

在使用嵌入式容器时,可以通过使用@ServletComponentScan来启用自动注册带有@WebServlet@WebFilter@WebListener注解的类。

容器之ServletWebServerApplicationContext

在底层,Spring Boot使用了另一种类型的ApplicationContext来支持嵌入式servlet容器。 ServletWebServerApplicationContext是一种特殊类型的WebApplicationContext,它通过搜索单个ServletWebServerFactory bean来引导自己。通常TomcatServletWebServerFactoryJetttyServletWebServerFactoryUndertowServletWebServerFactory都是自动配置的。

你通常不需要知道这些实现类。大多数应用程序都是自动配置的,并且创建适当的 ApplicationContextServletWebServerFactory

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

public class CustomServletContextListener implements ApplicationListener<ApplicationStartedEvent> {

  private ServletContext servletContext;

  @Override
  public void onApplicationEvent(ApplicationStartedEvent event) {
    ApplicationContext applicationContext = event.getApplicationContext();
    this.servletContext = ((WebApplicationContext) applicationContext).getServletContext();
  }

}

自定义Servlet容器

可以使用Spring环境属性来配置公共servlet容器设置。application.properties或application.yaml文件。

常见的服务器设置包括:

  • 网络设置:监听传入的HTTP请求的端口(server.port),绑定到server.address。地址,等等。
  • Session设置:会话是否持久(server.servlet.session.persistent),会话超时(server.servlet.session.timeout),会话数据的位置(server.servlet.session.store-dir),以及会话cookie配置(server.servlet.session.cookie.*)。
  • 错误管理:错误页面的位置(server.error.path)等。
  • SSL
  • HTTP compression

编程方式自定义配置

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

@Component
public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {

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

}

TomcatServletWebServerFactory, JetttyServletWebServerFactoryUndertowServletWebServerFactoryConfigurableServletWebServerFactory的子类,它们分别为Tomcat, Jetty和Undertow提供了额外的自定义设置方法。示例:

@Component
public class MyTomcatWebServerFactoryCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

  @Override
  public void customize(TomcatServletWebServerFactory server) {
    server.addConnectorCustomizers((connector) -> connector.setAsyncTimeout(Duration.ofSeconds(20).toMillis()));
  }

}

JSP限制

当运行一个使用嵌入式servlet容器的Spring Boot应用程序(打包为可执行的归档文件)时,对JSP的支持有一些限制。

  • 使用Jetty和Tomcat,如果你使用war打包,它应该可以正常工作。当使用java -jar启动时,不支持jsp
  • Undertow不支持jsp
  • 创建自定义error.jsp页面不会覆盖错误处理的默认视图。应该使用自定义错误页面。

完毕!!!

关注我长期更新

SpringBoot对Spring MVC都做了哪些事?(一)
SpringBoot对Spring MVC都做了哪些事?(二)
Springboot面试题整理附答案
SpringBoot配置文件你了解多少?
Springboot面试题整理附答案
SpringBoot项目中Redis之管道技术
Springboot接口幂等性基于token实现方案
SpringBoot开发自己的@Enable功能
SpringBoot WebFlux整合Spring Security进行权限认证
Springboot项目使用docker部署

相关推荐

“三次握手,四次挥手”你真的懂吗?

记得刚毕业找工作面试的时候,经常会被问到:你知道“3次握手,4次挥手”吗?这时候我会“胸有成竹”地“背诵”前期准备好的“答案”,第一次怎么怎么,第二次……答完就没有下文了,面试官貌似也没有深入下去的意...

面试官问:三次握手与四次挥手是怎么完成的?

作者|饶全成来源|码农桃花源记得刚毕业找工作面试的时候,经常会被问到:你知道“3次握手,4次挥手”吗?这时候我会“胸有成竹”地“背诵”前期准备好的“答案”,第一次怎么怎么,第二次……答完就没有...

三次握手和四次挥手的高阶面试题,建议收藏

昨天村长的讲解,真是一语点醒,这样的解释胜过死记硬背。但对于学习者,如果不能有直观感受,可能还是觉得不接地气,今天介绍两个工具,一个是网络抓包工具Wireshark,一个是linux命令tcpdum...

三次握手和四次挥手到底是个什么鬼东西

之前总有是有面试官喜欢问,你知道什么是三次握手么?什么是四次挥手么?为什么握手需要三次,挥手需要四次呢?今天我们就来详细的聊一下这个。1.什么是TCPTCP协议,简单称呼一下的话,那就是传输控制协议,...

加深理解TCP的三次握手与四次挥手

在了解三次握手和四次挥手之前,先要知道TCP报文内部包含了那些东西。熟悉了解TCP报文对日后学习网络和排除方面有很大的帮助,所以,今天为了加深对三次握手的理解,从新去认识TCP报文格式。TCP报文格式...

三次握手 与 四次挥手_三次握手四次挥手大白话

三次握手:①首先Client端发送连接请求报文②Server段接受连接后回复ACK报文,并为这次连接分配资源。③Client端接收到ACK报文后也向Server段发生ACK报文...

动画讲解TCP的3次握手,4次挥手,让你一次看明白

专注于Java领域优质技术,欢迎关注作者:老钱占小狼博客TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。本篇尝试...

linux下实现免密传输文件或登录到其他服务器

使用scp传输文件到其他服务器的时候,提示需要输密码,如下:[root@18csetup]#scpLINUX.X64_180000_db_home.zip192.168.133.120:/u0...

Linux如何通过salt免密SCP传输上百台机的脚本?看chatGPT的回答

如何通过salt免密SCP传输上百台机的shell脚本”,下面是chatGPT给出的结果。scp批量免密脚本给出的详细shell脚本如下:#!/bin/bash#源文件路径和目标路径SRC_...

Linux/Mac scp命令上传文件_将hdfs上的文件下载到本地的命令是

语法scp[可选参数]file_sourcefile_target参数说明:-1:强制scp命令使用协议ssh1-2:强制scp命令使用协议ssh2-4:强制scp命令只使用IPv4寻...

Linux常用功能——文件远程传输_linux 远程传输文件

scp是securecopy的简写,是linux系统下基于ssh登陆进行安全的远程文件拷贝命令,用于在Linux下进行远程拷贝文件的命令。和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器...

使用 scp 命令定时拉取服务器备份文件

我们的服务器,每周五必须要做下备份,但总是忘记执行备份这件事情,或者是服务器备份做了,但没有做异地备份。所以通过定时任务自动备份,备份成功之后,在其它服务器上面通过定时任务scp命令自动拉取备份文...

windows下最轻便的FTP/SCP文件管理器

这次推荐的工具叫做winscp,这个工具如果是IT从业人员,又是做服务端相关工作的话,可能无人不知,如果是刚入门,推荐立马上手试试。如果看了觉得有用,欢迎收藏、点赞、关注。官方网站:https://w...

我不是网管 - Linux中使用SCP命令安全复制文件

SCP是linux发行版中的命令行工具,用于通过网络安全地跨系统复制文件和目录。SCP代表安全复制,因为它使用ssh协议复制文件。拷贝时,scp命令建立ssh连接到远程系统。换句话说...

WinSCP软件双系统(Win-Linux)文件传输教程

WinSCP软件是windows下的一款使用ssh协议的开源图形化SFTP客户端,也就是一个文件传输的软件,它有什么优点吗,咱们嵌入式开发中经常会将windows中的文件复制到linux系统当中,比较...

取消回复欢迎 发表评论: