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

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


第一:监听器: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)时触发;
	 */
	@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 HandlerInterceptor {

	/**
	 * 调用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配置文件中






评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值