传统的javaEE增加Filter是在web.xml中配置,如以下代码:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.test.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
<init-param>
<param-name>paramName</param-name>
<param-value>paramValue</param-value>
</init-param>
</filter-mapping>
那在springboot中没有web.xml, 该如何配置Filter呢?
我们来看一下CharacterEncodingFilter是怎么配置的,见下图:
首先,我们可以发现CharacterEncodingFilter这个类的声明上面并没有@Component类似的注解,说明这个类并不能被Spring的注解扫描器扫描进Spring 的 Context,必须有一种方式能让Spring感知到这个Filter的存在,那么在spring boot 中是怎么做到的呢?见如下代码:
上图可见,是通过Spring-boot-autoconfig包下面的HttpEncodingAutoConfiguration这个配置类进行注入的。
然后再容器中找到Filter接口的所有实现类,并通过FilterRegistrationBeanAdapter转换为FilterRegistrationBean,这个类实现了ServletContextInitializer接口,用来在ServletContext中注入Filter。
也可以通过直接注入FilterRegistrationBean的实例:
还有一种比较方便的方式就是使用@WebFilter注解:
@Order(1)
@WebFilter(filterName = "filter1", urlPatterns = "/*")
public class FilterFirst implements Filter {
...
}
比较核心的代码是自定义类上面加上@WebFilter,其中@Order注解表示执行过滤顺序,值越小,越先执行。
这种方法效果和上面版本一样,但是用起来更加方便!