概述
在普通的JavaEE项目中,实现过滤器后,要在web.xml中配置后,才能生效,详见下面链接:
https://www.malaoshi.top/show_1EF6NZ9g38tI.html
但是,在springboot工程中,不需要web.xml,要通过其他方式实现
Filter过滤器类
过滤器类的实现,没有变化,还是要是实现javax.servlet.Filter 接口,这是 Servlet 的规范
例子
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() {
}
}
该代码非常简单,就是在访问资源前打印过滤器开始,在访问资源后打印过滤器结束
配置过滤器类
在Springboot中,通过FilterRegistrationBean来完成过滤器配置。其实现过程如下:
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new TestFilter());
//设置过滤器名称,可省略
//registration.setName("TestFilter");
//设置init参数
//filterRegistrationBean.addInitParameter("name","lilei");
//配置过滤规则
registration.addUrlPatterns("/*");
//执行顺序,只有1个过滤器时,可省略。越小越先执行
//registration.setOrder(1);
return registration;
}
}
补充:
- 可通过
filterRegistrationBean.setUrlPatterns(urls)设置多个URL匹配规则,传入List<String>类型的参数
配置类 与 web.xml 配置对比
如下图:
多个过滤器
新增加一个过滤器类
新增加一个过滤器类TestFilter2,代码如下:
public class TestFilter2 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("过滤器2开始");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("过滤器2结束");
}
@Override
public void destroy() {
}
}
修改配置类
在配置类中 再写一个方法 注册 新增的过滤器,并通过setOrder()方法指定了 过滤器的 执行顺序
在下面的代码中,先执行TestFilter2,然后再执行TestFilter
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new TestFilter());
//设置过滤器名称
registration.setName("TestFilter");
//设置init参数
//filterRegistrationBean.addInitParameter("name","lilei");
//配置过滤规则
registration.addUrlPatterns("/*");
//执行顺序
registration.setOrder(2);
return registration;
}
@Bean
public FilterRegistrationBean registFilter2() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new TestFilter2());
//设置过滤器名称
registration.setName("TestFilter2");
//设置init参数
//filterRegistrationBean.addInitParameter("name","lilei");
//配置过滤规则
registration.addUrlPatterns("/*");
//执行顺序
registration.setOrder(1);
return registration;
}
}
注意:
设置了顺序,越小越先执行
当不设置 过滤器执行顺序时,过滤器的执行顺序默认是 Bean 的加载顺序。在上面配置类中,先加载的是
reqResFilter()方法,后加载的是reqResFilter2()方法,所以先执行TestFilter过滤器, 后执行TestFilter2过滤器。
注册第三方过滤器
在项目里引入了第三方的jar,要使用jar里面的 Filter ,一般都是通过上面方法注册过滤器。
