微服务架构之Spring Boot(三十七)

2022-04-07 20:01:33 浏览数 (1)

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 的顺序进行配置。

0 人点赞