1.Filter
Filter 是java Web 中三大组件(Servlet、Filter、Listener)之一,是属于java web规范的组件。
过滤器是实现对请求资源(jsp、servlet、html)的过滤功能,是一个运行在服务器的程序,优先于请求资源(jsp、servlet、html)之前执行。
当浏览器发送请求给服务器的时候,先执⾏过滤器,然后才访问Web的资源。服务器响应Response,从Web资源抵达浏览器之前,也会途径过滤器。
典型用途如下:
- 在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest。
- 根据需要检查 HttpServletRequest ,也可以修改 HttpServletRequest 头和数据。
- 在 HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。
- 根据需要检查 HttpServletResponse,可以修改 HttpServletResponse 头和数据。
2.Interceptor
SpringMVC的Interceptor类似于Servlet开发中的过滤器Filter,用于对处理器(handler)进行预处理和后处理 。(进入到Interceptor 的时候,其实已经执行过 filter 了)
在SpringMVC中的 Http 请求执行过程中,要经过以下几个步骤 :
- 由 DispatcherServlet 捕获请求
- DispatcherServlet 将接收到的 URL 和对应的 Controller 进行映射
- 在请求到达相应的 Controller 之前,由拦截器对请求进行处理
- 处理完成之后,进行视图的解析
- 返回视图
所以,只有经过 DispatcherServlet 的请求才会被拦截器捕获,而我们自定义的 Servlet 请求则不会被拦截的。
3.Filter与Interceptor的区别
不同点:
①:Interceptor是基于java的反射机制(动态代理)的实现,而Filter是基于函数的回调。
②:Interceptor不依赖于servlet容器,而Filter依赖于servlet容器。
③:Interceptor只对Controller请求起作用,而Filter则可以对几乎所有的请求起作用。
④:Interceptor可以访问Controller上下文、值、栈里面的对象,而Filter不可以。
⑤:在spring容器的生命周期中,Interceptor可以多次被调用,而Filter只能在容器初始化时被调用一次。
⑥:Interceptor可以获取IOC容器中的各个bean,而Filter不行,这点很重要,在Interceptor里注入一个service,可以调用业务逻辑。
⑦:触发时机不同:
Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
Filter几乎可以对所有进入容器的请求起作用,而Interceptor只会对Controller中请求或访问static目录下的资源请求起作用。
⑧灵活性:从灵活性上说Interceptor功能更强大些,Filter能做的事情,Interceptor都能做,而且可以在请求前,请求后执行,比较灵活。
filter和interceptor并没有本质上的区别,作为一个工具来说,他们两者能够提供的能力基本是一样的。唯一需要注意的就是在执行时机上两者的不同(一个是在servlet执行前后处理,一个是在servlet内部执行),其他方面并没有显著的不同。这这也就意味着我们在实际开发使用时并不需要太过于纠结,毕竟老话说的好:黑猫白猫,抓到老鼠的就是好猫。