28.2.6 Web过滤器
Spring WebFlux提供了一个 WebFilter 接口,可以实现过滤HTTP请求 - 响应交换。在应用程序上下文中找到的 WebFilter beans将自动用于
过滤每个交换。
如果过滤器的顺序很重要,则可以实现 Ordered 或使用 @Order 进行注释。Spring Boot自动配置可以为您配置Web过滤器。执行此操作时,将
使用下表中显示的订单:
网络过滤器 订购
MetricsWebFilter Ordered.HIGHEST_PRECEDENCE 1
WebFilterChainProxy (Spring Security) -100
HttpTraceWebFilter Ordered.LOWEST_PRECEDENCE - 10
28.3 JAX-RS和Jersey
如果您更喜欢REST端点的JAX-RS编程模型,则可以使用其中一个可用的实现而不是Spring MVC。Jersey和 Apache CXF开箱即用。CXF要求您
在应用程序上下文中将 Servlet 或 Filter 注册为 @Bean 。Jersey具有一些本地Spring支持,因此我们还在Spring Boot中为其提供了自动配置
支持以及启动器。
要开始使用Jersey,请将 spring-boot-starter-jersey 作为依赖项包含在内,然后需要一个 @Bean 类型 ResourceConfig ,在其中注册所有
端点,如以下示例所示:
@Component
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(Endpoint.class);
}
}
Jersey对扫描可执行档案的支持相当有限。例如,它无法扫描完全可执行jar文件中的包中的端点,也无法在运行可执行war文件时
扫描 WEB-INF/classes 中的端点。为避免此限制,不应使用 packages 方法,并且应使用 register 方法单独注册端点,如上例
所示。
对于更高级的自定义,您还可以注册实现 ResourceConfigCustomizer 的任意数量的beans。
所有已注册的端点都应为 @Components ,并带有HTTP资源注释( @GET 和其他),如以下示例所示:
@Component
@Path("/hello")
public class Endpoint {
@GET
public String message() {
return "Hello";
}
}
由于 Endpoint 是Spring @Component ,其生命周期由Spring管理,您可以使用 @Autowired 注释注入依赖项并使用 @Value 注释注入外部组
态。默认情况下,Jersey servlet已注册并映射到 /* 。您可以通过将 @ApplicationPath 添加到 ResourceConfig 来更改映射。
默认情况下,Jersey设置为名为 jerseyServletRegistration 的 ServletRegistrationBean 类型的 @Bean 中的Servlet。默认情况下,
servlet是懒惰地初始化的,但您可以通过设置 spring.jersey.servlet.load-on-startup 来自定义该行为。您可以通过创建一个具有相同名
称的自己来禁用或覆盖bean。您也可以通过设置 spring.jersey.type=filter 来使用过滤器而不是servlet(在这种情况下,要替换或覆盖
的 @Bean 为 jerseyFilterRegistration )。过滤器的 @Order ,您可以使用 spring.jersey.filter.order 进行设置。通过使
用 spring.jersey.init.* 指定属性映射,可以为servlet和过滤器注册提供init参数。
有一个Jersey样本,以便您可以看到如何设置。
28.4嵌入式Servlet容器支持
Spring Boot包括对嵌入式Tomcat, Jetty和Undertow服务器的支持。大多数开发人员使用适当的“Starter”来获取完全配置的实例。默认情
况下,嵌入式服务器侦听端口 8080 上的HTTP请求。
如果您选择在CentOS上使用Tomcat ,请注意,默认情况下,临时目录用于存储已编译的JSP,文件上载等。当您的应用程序运行
时, tmpwatch 可能会删除此目录,从而导致失败。要避免此行为,您可能希望自定义 tmpwatch 配置,以便不删除 tomcat.* 目
录或配置 server.tomcat.basedir ,以便嵌入式Tomcat使用不同的位置。
28.4.1 Servlet,过滤器和监听器
使用嵌入式servlet容器时,可以使用Spring beans或扫描Servlet组件,从Servlet规范中注册servlet,过滤器和所有侦听器(例
如 HttpSessionListener )。
注册Servlet,过滤器和监听器Spring Beans
在嵌入式容器中注册了Spring bean的任何 Servlet , Filter 或servlet *Listener 实例。如果要在配置期间引用 application.properties
中的值,这可能特别方便。
默认情况下,如果上下文仅包含一个Servlet,则它将映射到 / 。在多个servlet beans的情况下,bean名称用作路径前缀。过滤器映射到 /* 。
如果基于约定的映射不够灵活,您可以使用 ServletRegistrationBean , FilterRegistrationBean
和 ServletListenerRegistrationBean 类进行完全控制。
Spring Boot附带了许多可以定义Filter beans的自动配置。以下是过滤器及其各自顺序的一些示例(较低的顺序值表示较高的优先级):
Servlet过滤器 订购
OrderedCharacterEncodingFilter Ordered.HIGHEST_PRECEDENCE
WebMvcMetricsFilter Ordered.HIGHEST_PRECEDENCE 1
ErrorPageFilter Ordered.HIGHEST_PRECEDENCE 1
HttpTraceFilter Ordered.LOWEST_PRECEDENCE - 10
将Filter beans无序放置通常是安全的。
如果需要特定订单,则应避免在 Ordered.HIGHEST_PRECEDENCE 处配置读取请求正文的筛选器,因为它可能违反应用程序的字符编码配置。如
果Servlet过滤器包装请求,则应使用小于或等于 OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER 的顺序进行配置。