@Component
@Order(1)
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println(“MyFilter”);
// 要继续处理请求,必须添加 filterChain.doFilter()
filterChain.doFilter(servletRequest,servletResponse);
}
}
没错就这么简单,这样 MyFilter 就生效了,写个Controller
调用一下就可以看到效果。
当有多个Filter时,这里的@Order(1)
注解会指定执行顺序,数字越小,越优先执行,如果只写@Order
,默认顺序值是Integer.MAX_VALUE
。
@Component + @Order 注解方式配置简单,支持自定义 Filter 顺序。缺点是只能拦截所有URL,不能通过配置去拦截指定的 URL。
2.@WebFilter+@ServletComponentScan
在 MyFilter
上添加@WebFilter
注解,并在启动类上增加@ServletComponentScan("com.zhengxl.filterdemo.filter")
注解,参数就是Filter所在的包路径,相当于告诉 SpringBoot,去哪里扫描 Filter
@WebFilter(urlPatterns = “/*”)
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println(“MyFilter”);
// 要继续处理请求,必须添加 filterChain.doFilter()
filterChain.doFilter(servletRequest,servletResponse);
}
}
@SpringBootApplication
@ServletComponentScan(“com.zhengxl.filterdemo.filter”)
public class FilterDemoApplication {
public static void main(String[] args) {
SpringApplication.run(FilterDemoApplication.class, args);
}
}
@WebFilter+@ServletComponentScan 注解方式支持对 Filter 匹配指定URL,但是不支持指定 Filter 的执行顺序。
3. JavaConfig 配置方式
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registerMyFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean<>();
bean.setOrder(1);
bean.setFilter(new MyFilter());
// 匹配"/hello/"下面的所有url
bean.addUrlPatterns(“/hello/*”);
return bean;
}
@Bean
public FilterRegistrationBean registerMyAnotherFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean<>();
bean.setOrder(2);
bean.setFilter(new MyAnotherFilter());
// 匹配所有url
bean.addUrlPatterns(“/*”);
return bean;
}
}
通过 Java 代码显式配置 Filter ,功能强大,配置灵活。只需要把每个自定义的 Filter 声明成 Bean 交给 Spring 管理即可,还可以设置匹配的 URL 、指定 Filter 的先后顺序。
3. 三种方式对比
以上介绍完 SpringBoot 中三种 Filter的使用姿势,非常简单,下面列个表格总结一下:
| 使用方式 | 排序 | 指定URL |
| — | — | — |
| @Component
@Order | 1 | 0 |
| @WebFilter
@ServletComponentScan | 0 | 1 |
| JavaConfig | 1 | 1 |
实际使用过程中,可以按照业务需求选择合适的使用方式,比如:如果编写的过滤器要拦截所有请求,不需要指定URL,那选择最简单的 @Component+@Order 就非常合适。
PS:其实还有第四种,web.xml配置,不过这都2020年了,用 SpringBoot 的自动装配或者 JavaConfig 不是更方便吗?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
惊喜
最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
时间不够,那么集中把这些算法题做完即可,命中率高达85%+)
[外链图片转存中…(img-bxLQTVWR-1713292345519)]
[外链图片转存中…(img-I2ZwTmpI-1713292345519)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!