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

来源:互联网 发布:调用外部js文件 编辑:程序博客网 时间:2024/05/17 07:33

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


第一:监听器: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()

列如:

package com.shichun.common.listener;import java.io.Serializable;import javax.servlet.http.HttpSessionActivationListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;import javax.servlet.http.HttpSessionEvent;/** * 绑定和解除绑定的监听事件 * 钝化和活化监听事件 * 不需要在web.xml 中配置  一般都是实体类实现接口即可
 * @author zsc * */public class User implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable {private static final long serialVersionUID = 1624003797969315721L;private String username;private String password;/** * 绑定时触发执行即:执行session.setAttribute(arg0, arg1)时触发; */@Overridepublic void valueBound(HttpSessionBindingEvent arg0) { }/** * 解除绑定时触发执行 即:执行session.removeAttribute(arg0)时触发; */@Overridepublic void valueUnbound(HttpSessionBindingEvent arg0) {}/** * 活化时触发执行 */@Overridepublic void sessionDidActivate(HttpSessionEvent arg0) { }/** * 钝化时触发执行 */@Overridepublic void sessionWillPassivate(HttpSessionEvent arg0) { }public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

扩展:

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中进行注册配置

package com.shichun.common.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;/** * 编写拦截器  只需要实现接口  HandlerInterceptor *  * @date 2017-09-20 * @author zsc * */public class FirstInterceptor implements HandlerInterceptor {/** * 调用handler之后执行 */@Overridepublic void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {}/** * 调用handler过程中执行 */@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3)throws Exception {}/** * 在调用handler之前调用 * true 不拦截;false 拦截 */@Overridepublic boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2) throws Exception {arg0.setCharacterEncoding("utf-8");//如果用户没有登录则禁止访问,跳转到登录页面if(arg0.getSession().getAttribute("user")==null){arg0.getRequestDispatcher("login.jsp").forward(arg0, arg1);return false;}return true;}}




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


执行顺序



拦截器与过滤器的区别:

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

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

   

   


第四、启动顺序:


监听器 > 过滤器 > 拦截器

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



配置位置:

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