监听器、过滤器、拦截器的启动顺序

这里主要是总结一下监听器、过滤器、拦截器的使用注意点和使用方法,还有就是三者之间的启动顺序。

第一:监听器:Listener

是servlet规范中定义的一种特殊类。

用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。

监听域对象的属性发生修改的事件。

用于在事件发生前、发生后做一些必要的处理。

用途:

1、统计在线人数和在线用户

2、系统启动时加载初始化信息

3、统计网站访问量

4、记录用户访问路径

4、跟Spring结合

实现:

1、创建一个实现监听器接口的类

2、配置web.xml进行注册(servlet2.5版本需要配置,servlet3.0版本可以用注解@WebListener)

说明:

1、一个Web.xml中可以配置多个监听器,监听器的启动顺序安装,配置顺序启动。

2、servlet3.0中使用注解配置时,不能控制监听器的启动顺序。

分类:

按照监听对象划分:

1、用于监听应用程序环境对象(servletContext)的事件监听器

2、用于监听用户回话对象(HttpSession)的事件监听器

3、用于监听请求消息对象(ServletRequest)的事件监听器

按照监听事件划分:

1、监听域对象自身的创建和销毁的事件监听器

创建类并且实现以下接口

servletContextListener

方法:contextInitialized()

  contextDestroyed()

HttpSessionListener

方法:sessionCreated()

  sessionDestroyed()

ServletRequestListener

方法:requestInitialized()

  requestDestroyed()

每个接口中都有两个方法方法

2、监听域对象中的属性的增加和删除的事件监听器

创建类并且实现以下接口

ServletContextAttributeListener

方法:attributeAdded()

attributeRemoved()

attributeReplaced()

HttpSessionAttributeListener

方法:attributeAdded()

attributeRemoved()

attributeReplaced()

ServletRequestAttributeListener

方法:attributeAdded()

attributeRemoved()

attributeReplaced()

3、监听绑定到HttpSession域中的某个对象的状态的事件监听器

实现两个接口

HttpSessionBindingListener()

HttpSessionActivationListener()

列如:

[html] view plain copy
 
  1. package com.shichun.common.listener;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.servlet.http.HttpSessionActivationListener;  
  6. import javax.servlet.http.HttpSessionBindingEvent;  
  7. import javax.servlet.http.HttpSessionBindingListener;  
  8. import javax.servlet.http.HttpSessionEvent;  
  9.   
  10. /**  
  11.  * 绑定和解除绑定的监听事件  
  12.  * 钝化和活化监听事件  
  13.  * 不需要在web.xml 中配置  一般都是实体类实现接口即可  
[html] view plain copy
 
  1. * @author zsc  
  2. *  
  3. */  
  4. ublic class User implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable {  
  5.   
  6. private static final long serialVersionUID = 1624003797969315721L;  
  7.   
  8. private String username;  
  9.   
  10. private String password;  
  11.   
  12.   
  13. /**  
  14.  * 绑定时触发执行即:执行session.setAttribute(arg0, arg1)时触发;  
  15.  */  
  16. @Override  
  17. public void valueBound(HttpSessionBindingEvent arg0) {  
  18.        
  19.   
  20. }  
  21.   
  22. /**  
  23.  * 解除绑定时触发执行 即:执行session.removeAttribute(arg0)时触发;  
  24.  */  
  25. @Override  
  26. public void valueUnbound(HttpSessionBindingEvent arg0) {  
  27.       
  28. }  
  29.   
  30. /**  
  31.  * 活化时触发执行  
  32.  */  
  33. @Override  
  34. public void sessionDidActivate(HttpSessionEvent arg0) {  
  35.        
  36.       
  37. }  
  38.   
  39. /**  
  40.  * 钝化时触发执行  
  41.  */  
  42. @Override  
  43. public void sessionWillPassivate(HttpSessionEvent arg0) {  
  44.        
  45.       
  46. }  
  47.   
  48.   
  49. public String getUsername() {  
  50.     return username;  
  51. }  
  52.   
  53. public void setUsername(String username) {  
  54.     this.username = username;  
  55. }  
  56.   
  57. public String getPassword() {  
  58.     return password;  
  59. }  
  60.   
  61. public void setPassword(String password) {  
  62.     this.password = password;  
  63. }  


扩展:

Session对象创建时间:

打开浏览器访问时,服务器端创建session对象

Session对象销毁时间:

1、关闭服务器

2、关闭浏览器一段时候后,session会自动销毁

3、用户退出,调用删除session方法

4、不关闭浏览器,session超时

在servlet3.0下监听器的用法

使用注解@WebListener

该注解用于将类声明为监听器,被@WebListener标注的类必须实现以下至少一个接口:

ServletContextListener

        ServletContextAttributeListener

HttpSessionListener

                  HttpSessionAttributeListener

        ServletRequestListener

        ServletRequestAttributeListener

第二、过滤器:Filter

第三、拦截器:Interceptor

   拦截器一般配置在springMVC配置文件中。

   拦截用户发送到服务器的请求,统一对某些功能的增强。

   使用场景:一般解决一些共性问题(乱码问题,权限验证问题)

实现:

编写类实现接口org.springframework.web.servlet.HandlerInterceptor;

在springMVC.xml中进行注册配置

[java] view plain copy
 
  1. package com.shichun.common.interceptor;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.springframework.web.servlet.HandlerInterceptor;  
  7. import org.springframework.web.servlet.ModelAndView;  
  8.   
  9. /** 
  10.  * 编写拦截器  只需要实现接口  HandlerInterceptor 
  11.  *  
  12.  * @date 2017-09-20 
  13.  * @author zsc 
  14.  * 
  15.  */  
  16. public class FirstInterceptor implements <span style="color:#ff0000;">HandlerInterceptor</span> {  
  17.   
  18.     /** 
  19.      * 调用handler之后执行 
  20.      */  
  21.     @Override  
  22.     public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3)  
  23.             throws Exception {  
  24.     }  
  25.   
  26.       
  27.     /** 
  28.      * 调用handler过程中执行 
  29.      */  
  30.     @Override  
  31.     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3)  
  32.             throws Exception {  
  33.     }  
  34.       
  35.     /** 
  36.      * 在调用handler之前调用 
  37.      * true 不拦截;false 拦截 
  38.      */  
  39.     @Override  
  40.     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2) throws Exception {  
  41.         arg0.setCharacterEncoding("utf-8");  
  42.         //如果用户没有登录则禁止访问,跳转到登录页面  
  43.         if(arg0.getSession().getAttribute("user")==null){  
  44.             arg0.getRequestDispatcher("login.jsp").forward(arg0, arg1);  
  45.             return false;  
  46.         }  
  47.         return true;  
  48.     }  
  49.   
  50. }  



一个应用中配置多个拦截器:

执行顺序

拦截器与过滤器的区别:

过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大。

拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求。

   

   

第四、启动顺序:

监听器 > 过滤器 > 拦截器

我是这样记忆的:接到上级命令,要求对电话进去监听,过滤出恐怖分子,然后,拦截他们的恐怖袭击行动。

配置位置:

监听器、过滤器一般配置在web.xml中,拦截器一般配置在springmvc.xml配置文件中

原文地址:https://www.cnblogs.com/3chi/p/8513586.html