下一篇[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)。
要开始利用 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、安全]