概览
Servlet、Filter、Listener是配置到web.xml中,interceptor配置到spring.xml中,web.xml 的加载顺序是:context-param > listener > filter > servlet
一,Filter 过滤器
》概念
filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。
》生命周期
一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行
(1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
(2)、每一次请求时都只调用方法doFilter()进行处理;
(3)、停止服务器时调用destroy()方法,销毁实例。
》场景
filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等
二,Servlet 处理器
》概念
servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,用于客户端请求与服务器响应。
》生命周期
servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新结束。
(1)、装入:启动服务器时加载Servlet的实例;
(2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完;
(3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;
(4)、销毁:停止服务器时调用destroy()方法,销毁实例。
》场景
三,Interceptor 过滤器
》概念
是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作
》生命周期
以spring的拦截器为例,加载了spring.xml以后
(1)、初始化相应拦截器
(2)、当action请求来时调用intercept方法
preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,该方法将在请求处理之前进行调用。
- SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。
- 该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。
postHandle (HttpServletRequest request, HttpServletResponse response, Objecthandle, ModelAndView modelAndView) 方法,preHandle 方法的返回值为true 时才会执行
- postHandle 方法,在当前请求进行处理之后,也就是Controller 方法调用之后执行,会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
- postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行
afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handle,Exception ex) 方法,preHandle 方法的返回值为true 时才会执行
- 顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
(3)、服务器停止销毁interceptor。
》场景
权限检查:如是否已经登录,或则对某些数据具有增删改查等权限;
日志记录:可以记录请求信息的日志,以便进行信息监控,信息统计等;
性能监控:慢日志等。
四,Listener 监听器
》概念
从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。
》监听对象
第一类:ServletContext包括:ServletContextListener、ServletContextAttributeListener
第二类:HttpSession包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener
第三类:ServletRequest包括:ServletRequestListner、ServletRequestAttributeListener
》场景
监听 Servlet 上下文用来初始化一些数据
监听 HTTP Session 用来获取当前在线的人数
监听客户端请求的 ServletRequest 对象来获取用户的访问信息
五,区别与联系
一,Filter与Interceptor区别
一,区别
1.使用范围
- Filter是Servlet中定义的,所以只能用于Web程序中;
- Interceptor是Spring定义的,既可以用于web程序中,也可以用于其他程序中(Application、Swing);
2.实现机制
- 拦截器是基于java的反射机制的
- 过滤器是基于函数回调。
3.能使用资源不同
- Filter只能提前配置在web.xml中,无法获得更多的Spring的支持;
- Interceptor是Spring中的一个组件,配置在Spring的上下文中,能与Spring里的任何资源、对象(Service层、数据源、事务管理等)通过IOC注入到拦截器中,能与Spring其他组件完美结合;
4.使用的深度不同
- Filter只能在Servlet前后起作用,即chain.doFilter(request,response)方法调用的前后;
- Interceptor能深入方法的前后(preHandle、postHandle)、异常抛出前后等,因此拦截器具有更大的弹性;
5.初始化
- Filter过滤器只能在容器初始化时被调用一次;
- Interceptor没有初始化方法,拦截器可以多次被调用;
二,联系
chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的service()方法是在chain.doFilter(request, response);这个方法中进行的。其实从某种程度上来说拦截器是被包裹在过滤器之中的。
SpringMVC的机制是由同一个Servlet(DispatcherServlet)来分发请求给不同的Controller,其实这一步是在Servlet的service()方法(也就是springmvc中的doService())中执行的。