关于学习使用Servlet的Filter时遇到的问题

本文记录了在使用Filter过程中遇到的常见问题及解决方案,包括正确调用chain.doFilter()确保请求流程完整,理解请求前后文的区别,以及避免Filter重复注册导致的执行次数错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.简述

网站上有很多Filter的使用方法,这里就不重复了,只把我学习过程中遇到的两个问题记录一下,都是一些简单的问题,只怪自己没注意细节,同时基础不扎实。

二.问题

1.记得写chain.doFilter(request, response)方法

刚开始我不知道这个方法,然后发现请求总是到第一个Filter后就停止了,返回结果也是空的,最后才发现是少了这个方法;
chain是doFilter方法的第三个参数。这个方法会调用下一个Filter,如果没有Filter了就会调用请求的controller;

2.如何隔离request和response

在学时使用Filter时,我发现doFilter方法同时可以获取到request和response,但是我要如何判断是请求前还是请求后,其实还是chain.doFilter(request, response)这个方法,只怪自己不够细心。
看这个方法的源码,它有两个内部变量:pos和n,pos是当前Filter的下标,n是Filter的数量,进入这个方法后他会比较这两个数,如果还有Filter他就会在它内部调用下一个过滤器,所以层层调用下去直到controller,然后下面就没有调用了,退出这个方法,执行最后一个Filter的chain.doFilter(request, response)方法之后的代码,执行完后退出这个Filter,再退出倒数第二个Filter调用的chain.doFilter(request, response),执行其之后的代码…,所以doFilter中chain.doFilter(request, response)方法之前是请求前,之后是请求后。
知道答案后觉得和面向切面的思想很像,感觉自己之前也只是读了一下这个思想,代码写了一下spring怎么实现,根本就没有深刻的理解。

3.每个Filter都被调用了两次

这真的很奇怪,我想了好久,感觉和servlet没啥关系,自己的写法也没啥大问题,网上也没有,最后发现就是不细心和对spring不熟练。
原因是因为我在springboot启动类上注解了@ServletComponentScan对Filter进行发现,同时又在Filter上注解了@Component将其注册为bean,同一个Filter被发现了两次,所以执行了两次。

总结

打好基础,关注细节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值