监听器、过滤器、拦截器的启动顺序
这里主要是总结一下监听器、过滤器、拦截器的使用注意点和使用方法,还有就是三者之间的启动顺序。
第一:监听器: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
- *
- */
- ublic class User implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable {
- private static final long serialVersionUID = 1624003797969315721L;
- private String username;
- private String password;
- /**
- * 绑定时触发执行即:执行session.setAttribute(arg0, arg1)时触发;
- */
- @Override
- public void valueBound(HttpSessionBindingEvent arg0) {
- }
- /**
- * 解除绑定时触发执行 即:执行session.removeAttribute(arg0)时触发;
- */
- @Override
- public void valueUnbound(HttpSessionBindingEvent arg0) {
- }
- /**
- * 活化时触发执行
- */
- @Override
- public void sessionDidActivate(HttpSessionEvent arg0) {
- }
- /**
- * 钝化时触发执行
- */
- @Override
- public 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 <span style="color:#ff0000;">HandlerInterceptor</span> {
- /**
- * 调用handler之后执行
- */
- @Override
- public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3)
- throws Exception {
- }
- /**
- * 调用handler过程中执行
- */
- @Override
- public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3)
- throws Exception {
- }
- /**
- * 在调用handler之前调用
- * true 不拦截;false 拦截
- */
- @Override
- public 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配置文件中