Spring Boot 使用 Filter 的正确姿势!

@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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

惊喜

最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

image.png

image.png

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

[外链图片转存中…(img-bxLQTVWR-1713292345519)]

[外链图片转存中…(img-I2ZwTmpI-1713292345519)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值