下一篇[30、安全]

英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-developing-web-applications

GitHub:https://github.com/jijicai/Spring/tree/master/spring-boot

29.3、JAX-RS 和 Jersey

如果你喜好 REST 端点的 JAX-RS 编程模型,则你可以利用个中一个可用的实现来代替 Spring MVC。
Jersey 和 Apache CXF 的开箱即用效果非常好。
CXF 哀求你在运用程序高下文中将其 Servlet 或过滤器注册为 @Bean。
Jersey 有一些本地的 Spring 支持,因此我们也在 Spring Boot 中为它供应自动配置支持,同时还供应了一个启动器(starter)。

jerseyjspSpringBoot中文参考指南216293JAXRS 和 Jersey Angular

要开始利用 Jersey,须要将 spring-boot-starter-jersey 作为依赖项,然后须要一个 ResourceConfig 类型的 @Bean,在个中注册所有端点,如下面示例所示:

@Componentpublic class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(Endpoint.class); }}

警告:Jersey 对扫描可实行文件(archives)的支持相称有限。
例如,当运行可实行 war 文件时,它无法扫描在完备可实行 jar 文件或 WEB-INF/classes 中找到的包中的端点。
为了避免这种限定,不应该利用 packages 方法,而该当利用 register 方法单独注册端点,如前一个示例所示。

对付更高等的定制,您还可以注册实现 ResourceConfigCustomizer 的任意数量的 bean。

所有注册的端点都该当是带有 HTTP 资源表明(@GET 和其他)的 @Components,如下面示例所示:

@Component@Path("/hello")public class Endpoint { @GET public String message() { return "Hello"; }}

由于 Endpoint 是 Spring @Component,其生命周期由 Spring 管理,你可以利用 @Autowired 表明注入依赖项,并利用 @Value 表明注入外部配置。
默认情形下,Jersey servlet 已注册并映射到 /。
你可以通过向 ResourceConfig 添加 @ApplicationPath 来变动映射。

默认情形下,Jersey 在一个名为 jerseyServletRegistration 的 ServletRegistrationBean 类型的 @Bean 中设置为一个 Servlet。
默认情形下,servlet 是惰性初始化的,但是你可以通过设置 spring.jersey.servlet.load-on-startup 自定义该行为。
你可以通过利用相同的名称创建自己的 bean 来禁用或重写该 bean。
还可以通过设置 spring.jersey.type=filter 来利用过滤器而不是 servlet(在这种情形下,要更换或重写的 @Bean 是 jerseyFilterRegistration)。
过滤器有一个 @Order,可以用 spring.jersey.filter.order 设置。
通过利用 spring.jersey.init. 指定属性映射,可以为 servlet 和过滤器注册供应 init 参数。

这里有一个 Jersey 示例,你可以看看如何设置。
(https://github.com/spring-projects/spring-boot/tree/v2.1.6.RELEASE/spring-boot-samples/spring-boot-sample-jersey )

29.4、嵌入式 Servlet 容器支持

Spring Boot 包括对嵌入式 Tomcat、Jetty 和 Undertow 做事器的支持。
大多数开拓职员利用适当的“Starter”来得到完备配置的实例。
默认情形下,嵌入式做事器监听端口 8080 上的 HTTP 要求。

29.4.1、Servlet、过滤器和监听器

利用嵌入式 servlet 容器时,可以利用 Spring beans 或通过扫描 Servlet 组件从 Servlet 规范注册 servlet、过滤器和所有监听器(例如:HttpSessionListener)。

将 Servlets、Filters 和 Listeners 注册为 Spring Beans

任何作为 Spring bean 的 Servlet、Filter 或 servlet 监听器实例都会注册到嵌入式容器中。
如果要在配置过程中引用 application.properties 中的值,这会特殊方便。

默认情形下,如果高下文只包含一个 Servlet,则将其映射到 / 。
在多个 servlet bean 的情形下,bean 名称用作路径前缀。
过滤器映射到 / 。

如果基于约定的映射不足灵巧,则你可以利用 ServletRegistrationBean、FilterRegistrationBean 和 ServletListenerRegistrationBean 来完备掌握。

Spring Boot 附带了许多可以定义 Filter bean 的自动配置。
下面是一些 Filters 的示例及其各自的顺序(低阶值意味着更高的优先级):

Servlet FilterOrderOrderedCharacterEncodingFilterOrdered.HIGHEST_PRECEDENCEWebMvcMetricsFilterOrdered.HIGHEST_PRECEDENCE + 1ErrorPageFilterOrdered.HIGHEST_PRECEDENCE + 1HttpTraceFilterOrdered.LOWEST_PRECEDENCE - 10

常日情形下,不为 Filter beans 排序是安全的。

如果须要特定的顺序,则应避免配置以 Ordered.HIGHEST_PRECEDENCE 读取要求正文的 Filter,由于它可能违反运用程序的字符编码配置。
如果 Servlet 过滤器包装要求,则该当利用小于或即是 OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER 的顺序对其进行配置。

29.4.2、Servlet 高下文初始化

嵌入式 servlet 容器不会直接实行 Servlet 3.0+ 的 javax.servlet.ServletContainerInitializer 接口或 Spring 的 org.springframework.web.WebApplicationInitializer 接口。
这是一个故意的设计决策,旨在降落设计用于在 war 中运行的第三方库可能会毁坏 Spring Boot 运用程序的风险。

如果须要在 Spring Boot 运用程序中实行 servlet 高下文初始化,则应注册实现 org.springframework.boot.web.servlet.ServletContext 接口的 bean。
单个 onStartup 方法供应对 ServletContext 的访问,如果须要,可以很随意马虎地将其用作现有 WebApplicationInitializer 的适配器。

扫描 Servlets、Filters 和 监听器

在利用嵌入式容器时,可以通过利用 @ServletComponentScan 启用 @WebServlet、@WebFilter 和 @WebListener 表明的类的自动注册。

提示:@ServletComponentScan 在一个独立的容器中不起浸染,它利用容器的内置创造机制。

29.4.3、ServletWebServerApplicationContext

在底层,Spring Boot 利用不同类型的 ApplicationContext 来支持嵌入式 servlet 容器。
ServletWebServerApplicationContext 是一种分外类型的 WebApplicationContext,它通过搜索单个 ServletWebServerFactory bean 来勾引自己。
常日,TomcatServletWebServerFactory、JettyServletWebServerFactory 或 UndertowServletWebServerFactory 已自动配置。

注释:你常日不须要知道这些实现类。
大多数运用程序是自动配置的,适当的 ApplicationContext 和 ServletWebServerFactory 是代表你创建的。

29.4.4、自定义嵌入式 Servlet 容器

可以利用 Spring Environment 属性配置常用的 servlet 容器设置。
常日,你会在 application.properties 文件中定义属性。

常用做事器设置包括:

(1)网络设置:监听传入 HTTP 要求的端口(server.port),绑定到 server.address 的接口地址,等等。

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

(3)缺点管理:缺点页的位置(server.error.path)等。

(4)SSL(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto-embedded-web-servers.html#howto-configure-ssl )

(5)HTTP 压缩(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto-embedded-web-servers.html#how-to-enable-http-response-compression )

Spring Boot 尽可能多地考试测验公开公共设置,但这并不总是可能的。
对付这些情形,专用名称空间供应特定于做事器的定制(请参阅 server.tomcat 和 server.undertow)。
例如,可以利用嵌入式 servlet 容器的特定功能配置访问日志。
(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto-embedded-web-servers.html#howto-configure-accesslogs )

提示:有关完全列表,请拜会 ServerProperties 类。
(https://github.com/spring-projects/spring-boot/tree/v2.1.6.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java )

程序化定制

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

import org.springframework.boot.web.server.WebServerFactoryCustomizer;import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;import org.springframework.stereotype.Component;@Componentpublic class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory server) { server.setPort(9000); }}

注释:TomcatServletWebServerFactory、JettyServletWebServerFactory 和 UndertowServletWebServerFactory 是ConfigurableServletWebServerFactory 的专用变体,它们分别为 Tomcat、Jetty 和 Undertow 供应了额外的定制 setter 方法。

直接自定义 ConfigurableServletWebServerFactory

如果前面的定制技能太有限,你可以自己注册 TomcatServletWebServerFactory、JettyServletWebServerFactory 或 UndertowServletWebServerFactory bean。

@Beanpublic 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。
如果你须要做一些更奇特的事情,还供应了几个受保护的方法钩子。
有关详细信息,请参阅源码文档。
(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/api/org/springframework/boot/web/servlet/server/ConfigurableServletWebServerFactory.html )

29.4.5、JSP 限定

当运行利用嵌入式 servlet 容器(并打包为可实行归档文件)的 Spring Boot 运用程序时,JSP 支持有一些限定。

(1)对付 Jetty 和 Tomcat,如果利用 war 包装,它该当可以事情。
一个可实行的 war 在用 java-jar 启动时可以事情,并且可以支配到任何标准容器。
利用可实行 jar 时不支持 JSP。

(2)Undertow 不支持 JSP。

(3)创建自定义 error.jsp 页面不会覆盖默认的缺点处理视图。
该当利用自定义缺点页面。

这里有一个 JSP 示例,以便你理解如何进行设置。
(https://github.com/spring-projects/spring-boot/tree/v2.1.6.RELEASE/spring-boot-samples/spring-boot-sample-web-jsp )

29.5、嵌入式反应式 Server 支持

Spring Boot 包括对以下嵌入式反应式 web 做事器的支持:Reactor Netty、Tomcat、Jetty和Undertow。
大多数开拓职员利用适当的“Starter”来得到完备配置的实例。
默认情形下,嵌入式做事器监听端口 8080 上的 HTTP 要求。

29.6、反应式 Server 资源配置

当自动配置 Reactor Netty 或 Jetty 做事器时,Spring Boot 将创建特定的 bean,为做事器实例:ReactorResourceFactory 或 JettyResourceFactory ,供应 HTTP 资源。

默认情形下,这些资源还将与 Reactor Netty 和 Jetty 客户端共享,以得到最佳性能,条件是:

(1)做事器和客户端利用相同的技能。

(2)客户端实例是利用由 Spring Boot 自动配置的 WebClient.Builder bean 构建的。

开拓者可以通过供应自定义的 ReactorResourceFactory 或 JettyResourceFactory bean 来覆盖Jetty 和 Reactor Netty 的资源配置-这将运用于客户端和做事器。

你可以在 WebClient Runtime 章节中理解有关客户端资源配置的更多信息。
(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-webclient.html#boot-features-webclient-runtime )

上一篇[29.2 Spring WebFlux 框架]

下一篇[30、安全]