一.简述
网站上有很多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被发现了两次,所以执行了两次。
总结
打好基础,关注细节