springboot注册过滤器

需要使用过滤器的话,优先选择拦截器。因为拦截器符合 aop 思想。

在springboot中使用过滤器有三种方式。分别如下

方式一:传统 web

在传统javaweb、ssm中使用过滤器差不多类似,这里以 java配置为例,实现 Filter 接口

@WebFilter("/*")
public class MyFilter01 implements Filter {
    /*
    缺点:当有多个过滤器时,没有优先级,不能设置谁先执行
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter01");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

上述实现方式缺点就是当存在多个过滤器时,不能设置谁优先执行。

方式二:以组件

这种方式解决了当存在多个过滤器时,不能设置谁优先执行的问题。方式如下

@Component
@Order(99)//值小优先级高
public class MyFilter02 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter02");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

通过将过滤器以组件方式注入到springboot容器中,这样可以就通过 @Order注解来设置优先执行了。但是缺点是不能设置过滤的路径。

@Order:设置的值小,则优先级高

方式三:通过配置类

这种方式解决了上述两种方式的问题,思路是将过滤器通过配置类,配置其实例,来使用。

public class MyFilter04 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter04");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
public class MyFilter05 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter05");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

上述为过滤器,然后将过滤器通过配置类来配置其实例

@Configuration
public class FilterConfiguration {
    @Bean
    FilterRegistrationBean<MyFilter04> filterRegistrationBean04(){
        //通过FilterRegistrationBean类配置过滤器
        FilterRegistrationBean<MyFilter04> bean = new FilterRegistrationBean<>();
        bean.setFilter(new MyFilter04());
        bean.setUrlPatterns(Arrays.asList("/*"));
        bean.setOrder(70);
        return bean;
    }
    
    @Bean
    FilterRegistrationBean<MyFilter05> filterRegistrationBean05(){
        FilterRegistrationBean<MyFilter05> bean = new FilterRegistrationBean<>();
        bean.setFilter(new MyFilter05());
        bean.setUrlPatterns(Arrays.asList("/*"));
        bean.setOrder(69);
        return bean;
    }
}

在配置类中通过 FilterRegistrationBean 就可将过滤器注入容器中,通过其对象来设置过滤的 url、排序、过滤器

posted on 2023-06-17 21:31  xashould  阅读(415)  评论(0编辑  收藏  举报