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、排序、过滤器
。