Filter过滤器 and Listener监听器

一、Filter过滤器

基本概念:

	对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能

方法

方法声明功能描述
init(FilterConfig filterConfig)初始化方法
doFilter(ServletRequest request,ServletResponse,response,FilterChain chain)doFilter()方法有多个参数,其中,参数request和response为Web服务器或Filter链中的上一个Filter传递过来的请求和响应对象;参数chain代表当前Filter链的对象,在当前Filter对象中的doFilter()方法内部需要调用FilterChain对象的doFilter()方法,才能把请求交付给Filter链中的下一个Filter或者目标程序去处理
destroy()销毁方法

例:

package filter.test.demo001;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("Hello Servlet<br/>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
//        过滤器对象在初始化时调用,可以配置一些初始化参数
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//        用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法体会被调用
        PrintWriter out = servletResponse.getWriter();
        out.write("Hello MyFilter");
    }

    @Override
    public void destroy() {
//        过滤器对象在销毁时自动调用,释放资源
    }
}
    <filter><!--根元素用于注册一个Filter-->
        <filter-name>MyFilter</filter-name><!--子元素用于设置Filter名称-->
        <filter-class>filter.test.demo001.MyFilter</filter-class><!--子元素用于设置Filter类的完整名称-->
    </filter>
    <filter-mapping><!--根元素用于设置一个过滤器所拦截的资源-->
        <filter-name>MyFilter</filter-name><!--子元素必须与<filter>中的<filter-name>子元素相同-->
        <url-pattern>/MyServlet</url-pattern><!--子元素用于匹配用户请求的URL
            可以使用通配符“*”来表示,例如*do适用于所有以.do结尾的Servlet路径-->
    </filter-mapping>
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>filter.test.demo001.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

Filter配置

Filter配置方法

	1. web.xml配置方法
	2. 注解配置
		@WebFilter("/*")

配置详解:

	1. 拦截路径配置	
			1. 具体资源配置:/index.jsp 		只有访问index.jsp资源时过滤器才会拦截
			2. 目录拦截:/user/*					访问/user下的所有路径时,过滤器就会被执行
			3. 后缀名拦截:  *.jsp					访问所有jsp文件时,过滤器就会被执行
			4. 拦截所有资源:/*					访问所有资源时,过滤器就会被执行
	2. 拦截方式配置 :资源被访问的方式
			1.注解配置:设置dispatcherTypes属性

Filter映射

  1. 使用通配符“*”拦截用户的所有请求
    <filter-mapping><!--根元素用于设置一个过滤器所拦截的资源-->
        <filter-name>MyFilter</filter-name><!--子元素必须与<filter>中的<filter-name>子元素相同-->
        <url-pattern>/*</url-pattern><!--子元素用于匹配用户请求的URL
            可以使用通配符“*”来表示,例如*do适用于所有以.do结尾的Servlet路径-->
    </filter-mapping>
  1. 拦截不同方式的访问请求:dispatcherTypes属性
    1. REQUEST:默认值
      当用户直接访问页面时,Web容器将会调用过滤器
    2. INCLUDE:
      如果目标资源是通过RequestDispatcher的include()方法访问,该过滤器会被调用
    3. FORWARD:
      如果目标资源是通过RequestDispatcher的forward()方法访问,该过滤器会被调用
    4. ERROR:
      如果目标资源是通过声明式异常处理机制调用的,该过滤器会被调用
    5. ASYNC:异步访问资源

Filter链

在一个Web应用程序中可以注册多个Filter程序
每个Filter程序都可以针对某一个URL进行拦截
如果多个Filter程序都对同一个URL进行拦截
那么这些Filter就会组成一个Filter链(过滤器链)


在这里插入图片描述

FilterConfig接口

方法声明功能描述
String getFilterName()getFilterName()方法用于返回在web.xml文件中为Filter所设置的名称,也就是返回< filter-name >元素的设置值
String getInitParameter(String name)getInitParameter(String name)方法用于返回在web.xml文件中为Filter所设置的某个名称的初始化参数值,如果指定参数不存在,则返回null
Enumeration getInitParameterNames()getInitParameterNames()方法用于返回一个Enumeration集合对象,该集合对象中包含在web.xml文件中为当前Filter设置的所有初始化参数的名称
ServletContext getServletContext()getServletContext()用于返回FilterConfig对象中所包装的ServletContext对象的引用

二、Listener监听器

重要组成部分

  1. 事件(Event):用户的一个操作
  2. 事件源:产生事件的对象
  3. 事件监听器(Listener):负责监听发生在事件源上的事件
  4. 事件处理器:监听器的成员方法,当事件发生的时候会触发对应的处理器(成员方法)

工作步骤

  1. 将监听器绑定到事件源,也就是注册监听器
  2. 事件发生时会触发监听器的成员方法,即事件处理器,传递事件对象
  3. 事件处理器通过事件对象获得事件源,并对事件源进行处理

八种监听器

类型描述
ServletContextListener用于监听ServletContext对象的创建与销毁过程
HttpSessionListener用于监听HttpSession对象的创建与销毁过程
ServletRequestListener用于监听ServletRequest对象的创建与销毁过程
ServletContextAttributeListener用于监听ServletContext对象中的属性变更
HttpSessionAttributeListener用于监听HttpSession对象中的属性变更
ServletRequesetAttributeListener用于监听ServletRequeset对象中的属性变更
HttpSessionBindingListener用于监听JavaBean对象绑定到HttpSession对象和从HttpSession对象解绑的事件
HttpSessionActivationListener用于监听HttpSession中对象活化和钝化的过程

监听事件的分类

  1. 用于监听域对象创建和销毁的事件监听器(ServletContextListener接口、HttpSessionListener接口、ServletRequestListener接口)
  2. 用于监听域对象属性增加和删除的事件监听器(ServlerContextAttributeListener接口,HttpSessionAttributeListener接口,ServletRequesetAttributeListener接口)
  3. 用于监听绑定到HttpSession域中某个对象状态的事件监听器(HttpSessionBindingListener接口,HttpSessionActivationListener接口)

监听域对象的生命周期

 1. ServletContextListenerTomcat启动和关闭时调用下面两个方法
     public void contextInitialized(ServletContextEvent evt)ServletContext对象被创建后调用;
     public void contextDestroyed(ServletContextEvent evt)ServletContext对象被销毁前调用;
2. HttpSessionListener:开始会话和结束会话时调用下面两个方法
  	public void sessionCreated(HttpSessionEvent evt)HttpSession对象被创建后调用;
     public void sessionDestroyed(HttpSessionEvent evt)HttpSession对象被销毁前调用;
 3. ServletRequestListener:开始请求和结束请求时调用下面两个方法
    public void requestInitiallized(ServletRequestEvent evt)ServletRequest对象被创建后调用;
    public void requestDestroyed(ServletRequestEvent evt)ServletRequest对象被销毁前调用。

监听域对象的属性变更

1. ServletContextAttributeListener:
	在ServletContext域进行增、删、改属性时调用下面方法。
	public void attributeAdded(ServletContextAttributeEvent evt)
	public void attributeRemoved(ServletContextAttributeEvent evt)
	public void attributeReplaced(ServletContextAttributeEvent evt)
2. HttpSessionAttributeListener:
	在HttpSession域进行增、删、改属性时调用下面方法
	public void attributeAdded(HttpSessionBindingEvent evt)
	public void attributeRemoved(HttpSessionBindingEvent evt)
	public void attributeReplaced(HttpSessionBindingEvent evt) 
3. ServletRequestAttributeListener:
	在ServletRequest域进行增、删、改属性时调用下面方法
	public void attributeAdded(ServletRequestAttributeEvent evt)
	public void attributeRemoved(ServletRequestAttributeEvent evt)
	public void attributeReplaced(ServletRequestAttributeEvent evt)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值