拦截器是在SpringMVC中配置的,如果从整个项目中看,一个servlet请求的执行过程就变成了这样:
context-param --> listener --> filter --> servlet --> interceptor(拦截器)
为什么拦截器是在servlet执行之后,因为拦截器本身就是在servlet内部的
- 1)过滤器:
- 依赖于servlet容器
- 在实现上基于函数回调
- 可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。
使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:
- 在过滤器中修改字符编码;
- 在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。
- 2)拦截器:
- 依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。
- 在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。
由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。
但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
- 3)***:
web***是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
主要作用是:
感知到包括request(请求域),session(会话域)和applicaiton(应用程序)的初始化和属性的变化;
***的用途 :
1.通常使用Web***做以下的内容:
2.统计在线人数,利用HttpSessionLisener
3.加载初始化信息:利用ServletContextListener
4.统计网站访问量
5.实现访问监控
- 拦截器与过滤器的区别:
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖于servlet容器,而拦截器不依赖servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次, 执行顺序 :
过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);
过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;
Action处理完成返回后,拦截器还可以做其他过程,再向上返回到过滤器的后续操作。