概述
在普通的JavaEE项目中,实现过滤器后,要加上@WebFilter注解,才能生效
但是,在springboot工程中,主启动类还需要加上@ServletComponentScan注解,才能起作用
Filter过滤器类
过滤器类的实现,没有变化,还是要是实现javax.servlet.Filter 接口,这是 Servlet 的规范
例子
@WebFilter(urlPatterns = "/*", filterName = "TestFilter")
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器开始");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("过滤器结束");
}
@Override
public void destroy() {
}
}
该代码非常简单,就是在访问资源前打印过滤器开始,在访问资源后打印过滤器结束
修改主启动类
在启动类上加注解 @ServletComponentScan
@ServletComponentScan
@SpringBootApplication
@MapperScan("com.lvyou.mapper")
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
}
}
多个过滤器指定执行顺序
默认顺序
通过过滤器的类名指定执行顺序,比如2个过滤器:AuthFilter 和 TestFilter,一个首字母是A,一个首字母是T,所以先执行AuthFilter,后执行 TestFilter
无法指定顺序
通过 @Order 注解、Ordered 接口,是 不能 指定顺序的 (原本 order值越小,优先级越高,但无用)
提示:百度查的资料,均无效
注意
不能与 @Component 注解搭配使用,使用该注解,又对过滤器实例化一次,即:又创建一个过滤器对象,所以会导致过滤两次