springboot Filter过滤器的实现(配置类方式)

概述

在普通的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 ,一般都是通过上面方法注册过滤器。


原文出处:/show_1EF6XTuFaZzR.html