27.4.1 Servlets、Filters和listeners

使用内嵌servlet容器时,你可以通过使用Spring beans或扫描Servlet组件的方式注册servlets,filters及特定Servlet相关的所有listeners(比如HttpSessionListener)。

将Servlet、Filter和listener注册为Spring bean

所有ServletFilter或servlet *Listener实例,只要是Spring bean,都会注册到内嵌容器中。如果想在配置期间引用application.properties的属性,这是非常方便的。默认情况下,如果上下文只包含单个Servlet,那它将被映射到/。如果存在多个servlet beans,那么bean的名称将被用作路径的前缀,过滤器将映射到/*

如果基于约定(convention-based)的映射不够灵活,你可以使用ServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBean实现完全的控制。

Spring Boot带有许多的自动配置。它们可能定义Filter bean。这里有一些Filter以及它们的顺序的例子(低位意味着更高的优先级)。

Servlet Filter

Order

OrderedCharacterEncodingFilter

Ordered.HIGHEST_PRECEDENCE

WebMvcMetricsFilter

Ordered.HIGHEST_PRECEDENCE + 1

ErrorPageFilter

Ordered.HIGHEST_PRECEDENCE + 1

HttpTraceFilter

Ordered.LOWEST_PRECEDENCE - 10

无序的Filter bean通常是安全的。

如果需要一个特定的顺序,你应当避免配置一个在Ordered.HIGHEST_PRECEDENCE上读取请求体的Filter。因为它可能违反你的应用的字符编码配置。如果一个Servlet filter包裹请求,它应当被配置一个顺序。此顺序不高于FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER