新聞中心
概述
Spring Boot支持嵌入式Tomcat、Jetty和Undertow服務(wù)器。大多數(shù)開發(fā)人員使用適當(dāng)?shù)?“starter”來獲得完全配置的實(shí)例。默認(rèn)情況下,嵌入式服務(wù)器在端口8080上監(jiān)聽HTTP請(qǐng)求。

創(chuàng)新互聯(lián)公司主營(yíng)上林網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開發(fā),上林h5小程序制作搭建,上林網(wǎng)站營(yíng)銷推廣歡迎上林等地區(qū)企業(yè)咨詢
默認(rèn)引入下面依賴使用Tomcat服務(wù)器。
org.springframework.boot
spring-boot-starter-web
如需要使用其它如Undertow作為服務(wù)器只需要如下依賴即可。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-undertow
Servlets, Filters, and listeners
當(dāng)使用嵌入式servlet容器時(shí),可以通過使用Spring bean或掃描servlet組件來注冊(cè)servlet、filter和servlet規(guī)范中的所有監(jiān)聽器(如HttpSessionListener)。
Registering Servlets, Filters, and Listeners as Spring Beans
任何Spring bean的Servlet、Filter或 *Listener實(shí)例都注冊(cè)到嵌入式容器中。如果你想從應(yīng)用程序中引用一個(gè)值,這可能特別方便。配置過程中的屬性。
默認(rèn)情況下,如果上下文只包含單個(gè)Servlet,則將其映射到/。在有多個(gè)servlet bean的情況下,bean名用作路徑前綴。Filter映射到/*。
如果基于約定的映射不夠靈活,可以使用ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean類進(jìn)行完全控制。
通常情況下,將Filter Bean放置無序是安全的。如果需要特定的順序,則應(yīng)該使用@Order注釋過濾器,或者讓它實(shí)現(xiàn)Ordered。你不能通過給過濾器的bean方法加上@Order注解來配置它的順序。如果不能更改過濾器類以添加@Order或?qū)崿F(xiàn)Ordered,則必須為過濾器定義一個(gè)FilterRegistrationBean,并使用setOrder(int)方法設(shè)置注冊(cè)bean的訂單。避免配置按順序讀取請(qǐng)求體的過濾器。
注:要查看應(yīng)用程序中每個(gè)過濾器的順序,請(qǐng)為web日志組啟用調(diào)試級(jí)別日志(logging.level.web=debug)。注冊(cè)過濾器的詳細(xì)信息,包括它們的順序和URL模式,將在啟動(dòng)時(shí)記錄下來。
Servlet Context Initialization
嵌入式servlet容器不會(huì)直接執(zhí)行servlet 3.0+javax.servlet.ServletContainerInitializer接口或Spring的org.springframework.web.WebApplicationInitializer接口。這樣做是有意為之,目的是降低在war中運(yùn)行的第三方庫(kù)破壞Spring Boot應(yīng)用程序的風(fēng)險(xiǎn)。
如果需要在Spring Boot應(yīng)用程序中執(zhí)行servlet上下文初始化,應(yīng)該注冊(cè)一個(gè)實(shí)現(xiàn)org.springframework.boot.web.servlet.ServletContextInitializer接口的bean。單一的onStartup方法提供了對(duì)ServletContext的訪問,如果有必要,可以很容易地將其用作現(xiàn)有WebApplicationInitializer的適配器。
掃描 Servlets, Filters, and listeners。
在使用嵌入式容器時(shí),可以通過使用@ServletComponentScan?來啟用自動(dòng)注冊(cè)帶有@WebServlet、@WebFilter和@WebListener注解的類。
容器之ServletWebServerApplicationContext
在底層,Spring Boot使用了另一種類型的ApplicationContext來支持嵌入式servlet容器。ServletWebServerApplicationContext是一種特殊類型的WebApplicationContext,它通過搜索單個(gè)ServletWebServerFactory bean來引導(dǎo)自己。通常TomcatServletWebServerFactory、JetttyServletWebServerFactory或UndertowServletWebServerFactory都是自動(dòng)配置的。
你通常不需要知道這些實(shí)現(xiàn)類。大多數(shù)應(yīng)用程序都是自動(dòng)配置的,并且創(chuàng)建適當(dāng)?shù)?nbsp;ApplicationContext和ServletWebServerFactory。
在嵌入式容器設(shè)置中,ServletContext被設(shè)置為服務(wù)器啟動(dòng)的一部分,該啟動(dòng)發(fā)生在應(yīng)用程序上下文初始化期間。因此,ApplicationContext中的bean不能可靠地用ServletContext進(jìn)行初始化。解決這個(gè)問題的一種方法是注入ApplicationContext作為bean的依賴項(xiàng),并僅在需要時(shí)訪問ServletContext。另一種方法是在服務(wù)器啟動(dòng)后使用回調(diào)函數(shù)。這可以使用ApplicationListener來監(jiān)聽ApplicationStartedEvent,如下所示:
public class CustomServletContextListener implements ApplicationListener{
private ServletContext servletContext;
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
this.servletContext = ((WebApplicationContext) applicationContext).getServletContext();
}
}
自定義Servlet容器
可以使用Spring環(huán)境屬性來配置公共servlet容器設(shè)置。application.properties或application.yaml文件。
常見的服務(wù)器設(shè)置包括:
- 網(wǎng)絡(luò)設(shè)置:監(jiān)聽傳入的HTTP請(qǐng)求的端口(server.port),綁定到server.address。地址,等等。
- Session設(shè)置:會(huì)話是否持久(server.servlet.session.persistent),會(huì)話超時(shí)(server.servlet.session.timeout),會(huì)話數(shù)據(jù)的位置(server.servlet.session.store-dir),以及會(huì)話cookie配置(server.servlet.session.cookie.*)。
- 錯(cuò)誤管理:錯(cuò)誤頁(yè)面的位置(server.error.path)等。
- SSL
- HTTP compression
編程方式自定義配置
如果需要以編程方式配置嵌入式servlet容器,可以注冊(cè)一個(gè)實(shí)現(xiàn)WebServerFactoryCustomizer接口的Spring bean。WebServerFactoryCustomizer提供了對(duì)ConfigurableServletWebServerFactory的訪問,其中包括許多自定義設(shè)置方法。示例:
@Component
public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer{
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}
TomcatServletWebServerFactory,JetttyServletWebServerFactory和UndertowServletWebServerFactory是ConfigurableServletWebServerFactory的子類,它們分別為Tomcat, Jetty和Undertow提供了額外的自定義設(shè)置方法。示例:
@Component
public class MyTomcatWebServerFactoryCustomizer implements WebServerFactoryCustomizer{
@Override
public void customize(TomcatServletWebServerFactory server) {
server.addConnectorCustomizers((connector) -> connector.setAsyncTimeout(Duration.ofSeconds(20).toMillis()));
}
}
JSP限制
當(dāng)運(yùn)行一個(gè)使用嵌入式servlet容器的Spring Boot應(yīng)用程序(打包為可執(zhí)行的歸檔文件)時(shí),對(duì)JSP的支持有一些限制。
- 使用Jetty和Tomcat,如果你使用war打包,它應(yīng)該可以正常工作。當(dāng)使用java -jar啟動(dòng)時(shí),不支持jsp。
- Undertow不支持jsp。
- 創(chuàng)建自定義error.jsp頁(yè)面不會(huì)覆蓋錯(cuò)誤處理的默認(rèn)視圖。應(yīng)該使用自定義錯(cuò)誤頁(yè)面。
網(wǎng)站標(biāo)題:SpringBoot嵌入式容器詳細(xì)介紹
文章分享:http://www.dlmjj.cn/article/cojjsdo.html


咨詢
建站咨詢
