springboot集成多个Filter的方法

SpringBoot框架提供了两种使用过滤器的方式, 一种是注解, 一种是配置类。

  • 注解
    我们可以自定义几个过滤器类。
/**
 * @Description: 自定义过滤器类
 * @Author: YangHang
 * @Date: 2019/6/28 13:46
 */
@Order(1)
@WebFilter(urlPatterns = "/user/*")
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器1...方法执行前...");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("过滤器1...方法执行后...");
    }
}

继承的接口为Filter, 看源码中初始化和销毁方法的接口都是默认接口(JDK8)。因此不需要的话,我们只需要实现doFilter方法。
springboot集成多个Filter的方法_第1张图片
我们使用@WebFilter注解之后, Spring就会知道我们配置了一个拦截器, 当然, 我们需要配置要拦截的路径, 记得要“/”开头。这样就可以完成过滤器的配置。

  • 配置类
    我们可以新增配置类, 加上@Configuration注解, 这样SpringBoot在启动的时候, 会自动帮你装载这个类里面的Bean。
    这个Bean的类型是org.springframework.boot.web.servlet.FilterRegistrationBean。代码如下:
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean filter1() {
        return new FilterRegistrationBean(
                (a,b,c) -> {
                    System.out.println("过滤器1... 方法执行开始");
                    c.doFilter(a,b);
                    System.out.println("过滤器1... 方法执行结束");
                }
        ) {{
            setOrder(1);
            setName("过滤器1");
            setEnabled(true);
            setUrlPatterns(Arrays.asList("/user/*"));
        }};
    }

    @Bean
    public FilterRegistrationBean filter2() {
        return new FilterRegistrationBean(
                (a,b,c) -> {
                    System.out.println("过滤器2... 方法执行开始");
                    c.doFilter(a,b);
                    System.out.println("过滤器2... 方法执行结束");
                }
         ){{
            setOrder(2);
            setName("过滤器2");
            setEnabled(true);
            setUrlPatterns(Arrays.asList("/user/*"));
        }};
    }

}

其中order是过滤器执行的顺序,越小越早执行。
然后我们就可以对如下的访问进行拦截。
springboot集成多个Filter的方法_第2张图片
ps:
多个过滤器使用,使用配置类的话有一个巨坑, 我们要设置可用, 也就是setEnabled(true); 否则只走一个过滤器。

你可能感兴趣的:(SpringBoot)