JavaWeb三大组件之Filter和Listener


Filter

  1) filter简介  

  filer是javaweb中的过滤器,它与servlet一样,也有三个生命周期方法,同时在web.xml的配置也差不多.但是两者的主要功能不同,servlet负责处理请求,filter负责拦截请求和放行.可以实现Url级别的权限访问,敏感词汇过滤,解决编码问题等等. 

  2) filter实现原理

  Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

  1. 调用目标资源之前,让一段代码执行。
  2. 是否调用目标资源(即是否让用户访问web资源)。
  3. 调用目标资源之后,让一段代码执行。

  web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,我们可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。

  3) filter实现步骤

  1. 编写java类实现Filter接口,并实现其doFilter方法。
  2. 在 web.xml 文件中使用元素对编写的filter类进行注册,并设置它所能拦截的资源。

  范例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package com.test.web.filter;   import java.io.IOException;   import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;   public class FilterDemo01 implements Filter {       @Override     public void init(FilterConfig filterConfig) throws ServletException {         System.out.println("----过滤器初始化----");     }       @Override     public void doFilter(ServletRequest request, ServletResponse response,             FilterChain chain) throws IOException, ServletException {                   //对request和response进行一些预处理         request.setCharacterEncoding("UTF-8");         response.setContentType("text/html;charset=UTF-8");                   System.out.println("Filter执行前");         chain.doFilter(request, response);  //放行         System.out.println("Filter执行后");     }       @Override     public void destroy() {         System.out.println("----过滤器销毁----");     } }

  重要的一步,在web.xml中配置拦截规则

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xml version="1.0" encoding="UTF-8"?>      <filter>       <filter-name>FilterDemo01filter-name>       <filter-class>me.gacl.web.filter.FilterDemo01filter-class>   filter>          <filter-mapping>       <filter-name>FilterDemo01filter-name>              <url-pattern>/*url-pattern>   filter-mapping>     web-app>

  4) filter的四种拦截方式

  REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;

      FORWARD:转发访问执行过滤器。包括RequestDispatcher#forward()方法、标签都是转发访问;

      INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、标签都是包含访问;

      ERROR:当目标资源在web.xml中配置为中时,出现异常后,转发到目标资源时,会执行过滤器。


 Listener

   1) 监听器简介

  监听器就是一个实现了特定接口的java类,这个java类用来监听另外一个java类的方法调用或者属性改变,当被监听的对象发生上述事件后,监听器的某个方法就会立即执行.这里就涉及几个相关概念:

  事件源:被监听的对象

  事件:就是事件源的改变,一旦发生变化,事件就会传递给监听器对象,监听器的对应方法就会执行  

  监听器:监听的对象

  绑定监听器:在事件上绑定监听器

  2)监听器的分类

    在servlet的规范中定义了多种类型的监听器,主要用来监听ServletContext,HttpSession,ServletReques三个域对象.按照功能划分,可以分成三类:

    • 一类:监听三个域对象的创建和销毁的监听器
    • 二类:监听三个域对象的属性变更的监听器(xxxAttribute())
    • 三类:监听HttpSession对象中的JavaBean的状态的改变.(绑定,解除绑定,钝化,活化)  

    2.1)监听ServletContext对象(对应jsp内置对象——application对象),对ServletCOntext对象实现监听,可以监听到ServletContext对象中属性的变化(增删改操作),也可以就监听到ServletContext对象本身的变化(创建和销毁)。常见监听方法:

    2.2)监听会话(HttpSession对象)(对应jsp内置对象——session对象)常见监听方法:

  注:

  活化(Activate)和钝化(Passivate)是Web容器为了更好地利用系统资源或者进行服务器负载平衡等原因而对特定对象采取的措施。

  会话对象的钝化是指暂时将会话对象通过序列化的方法存储到硬盘上;

  活化与钝化相反,是把硬盘上存储的会话对象重新加载到Web容器中。

  Tomcat中的两种钝化管理器:org.apache.catalina.session.StandardManger和org.apache.catalina.session.Persistentmanger

    2.3)监听请求(ServletRequest对象)(对应jsp内置对象——request对象)常见监听方法:

  3) 监听器的启动顺序

  当有多个监听器时,按各监听器在web.xml中配置的顺序进行先后顺序启动。相较于过滤器、Servlet的启动顺序是:监听器>过滤器>Servlet