新建三个 Filter:
FilterA:
Java代码
- public class FilterA implements Filter {...}
FilterB
Java代码
- public class FilterB implements Filter {...}
FilterC
Java代码
- public class FilterC implements Filter {...}
依赖的Java类:
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
注册Filter
在SpringBoot的配置类中,添加如下配置:
Java代码
- @Bean
- public FilterRegistrationBean registrationFilterA() {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
- // 注册 FilterA
- filterRegistrationBean.setFilter(new FilterA());
- // 设置拦截哪些 URL
- filterRegistrationBean.addUrlPatterns("/*");
- // 设置执行顺序,值越小,越先执行。
- filterRegistrationBean.setOrder(3);
- // 是否启用,如果值为false,则不启用该 Filter
- filterRegistrationBean.setEnabled(true);
- return filterRegistrationBean;
- }
- @Bean
- public FilterRegistrationBean registrationFilterB() {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
- // 注册 FilterB
- filterRegistrationBean.setFilter(new FilterB());
- filterRegistrationBean.addUrlPatterns("/*");
- filterRegistrationBean.setOrder(2);
- filterRegistrationBean.setEnabled(true);
- return filterRegistrationBean;
- }
- @Bean
- public FilterRegistrationBean registrationFilterC() {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
- // 注册 FilterC
- filterRegistrationBean.setFilter(new FilterC());
- filterRegistrationBean.addUrlPatterns("/*");
- filterRegistrationBean.setOrder(1);
- filterRegistrationBean.setEnabled(true);
- return filterRegistrationBean;
- }
特别说明:
1、通过 FilterRegistrationBean 注册的 Filter ,一定不要添加@WebFilter注解,否则,会生成两个 Filter 实例(这并不是我们所期望的)。
2、同一个SpringBoot应用中,通过 @WebFilter 注册的 Filter 总是要晚于 通过 FilterRegistrationBean 注册的 Filter 执行。
关于filterRegistrationBean.setOrder(int order)
如果想要某个 Filter 最先执行,可以这么写
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
如果想要某个Filter最后执行,可以这么写
filterRegistrationBean.setOrder(Ordered.LOWEST_PRECEDENCE);
关于org.springframework.core.Ordered
Java代码
- /**
- * Useful constant for the highest precedence value.
- * @see java.lang.Integer#MIN_VALUE
- */
- int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;
- /**
- * Useful constant for the lowest precedence value.
- * @see java.lang.Integer#MAX_VALUE
- */
- int LOWEST_PRECEDENCE = Integer.MAX_VALUE;