Java中拦截器与过滤器的不同点
题外话:
在课堂上突然被老师点名回答问题:
SpringSecurity
框架是通过拦截器的技术来实现检查认证功能的,在之前Servlet
的学习中,我们学过了过滤器技术,那么请你回答一下过滤器与拦截器之间的不同。额...额...额...
疏于总结的我一下就被问住了,只简简单单说了一句:拦截器与过滤器都是对于客户端发送到服务端的请求进行拦截进行一些业务操作的技术;
说了跟没说一样,而且答非所问,因为平时的知识不成体系,知识点与知识点之间并没有多少关联性,导致记忆起来也是十分低效,况且每天用来梳理知识的时间占比并不大。然后很“坦率”地交待了:其他的我不记得了
非常尴尬
所以简单小结一下二者的差别:
1. 底层实现
-
过滤器(Filter)是基于函数回调,属于 servlet 规范一部分,依赖于 servlet 容器,任何框架都可以使用过滤器技术
-
拦截器(Interceptor)是基于java的反射机制, 依赖于 web 框架,例如:SpringMVC,属于面向切面编程(AOP)的一种实现方式
2. 拦截资源
-
过滤器配置了
/*
,可以拦截任何资源及请求 -
拦截器只拦截 action 请求(不拦截静态资源请求)
3. 应用场景
-
使用过滤器的目的是用来做一些过滤操作,获取我们想要的数据,比如
-
在过滤器中修改字符编码
-
在过滤器中修改
HttpServletRequest
的一些参数,包括:敏感词过滤等
-
-
拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(拦截器类中注入一个service bean)进行一些业务操作,比如
-
日志记录:记录请求信息的日志
-
权限检查:如登录检查(一般使用 SpringSecurity 框架)
-
性能检测:检测方法的执行时间
-
4. 局限性比较
-
拦截器实例在 action 请求的生命周期内可以多次调用,一个过滤器实例只会在容器初始化时调用一次
-
拦截器可以获取 spring 容器里的对象,过滤器不可以
5. 拦截器是被包裹在过滤器之中
Ps:何谓 action 请求?
个人理解:springmvc中,客户端向服务端的控制层发起的一切请求