过滤器和监听器

2019-08-26

过滤器

1、什么是过滤器?

  原理:拦截  检查  放行,其实就是对资源的一种筛选,过滤

2、过滤器的创建过程

  实现一个接口:Filter

  重写三个方法  init  doFilter  destroy

  在web.xml中配置过滤器 

<filter>
      <filter-name>配置名字</filter-name>
      <filter-class>Filter类全名</filter-class>
 </filter>
<filter-mapping>
      <filter-name>配置名字</filter-name>
      <url-pattern>过滤路径</url-pattern>
</filter-mapping>

3、过滤器的生命周期

  过滤器对象创建时,执行init方法一次,反复执行doFilter方法,Filter对象销毁时,执行destroy方法一次。

 过滤器什么时候创建?什么时候销毁?

  服务器启动时创建,服务器关闭时销毁。

4、Filter中的方法 

public void init(FilterConfig arg0)
init方法是,Filter对象创建时执行的方法。
该方法的参数 FilterConfig 作用:
  String getFilterName()                    获取Filter 的name
  String getInitParameter(String name)      获取初始化参数         
   Enumeration getInitParameterNames()   获取初始化参数的名字
  ServletContext getServletContext()        获取ServletContext
public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2)
  doFilter方法是在访问过滤时,反复执行的方法。(起到拦截和放行的作用)
  该方法的参数 FilterChain 用来做过滤的放行工作。(所谓放行是指拦截后,进入要请求的资源)
 arg2.doFilter(arg0,arg1);放行
public void destroy() {
         System.out.println("TestFilter...destroy...");
}//过滤器销毁时调用的方法

5、过滤器的执行流程

  单个过滤器

分享图片

  多个过滤器---责任链模式

分享图片

6、过滤器配置文件  注解模式@webFilter("过滤的路径")

<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>过滤的路径</url-pattern>
<dispatcher>   ---> 配置过滤器的过滤方式
    REQUEST  默认  拦截请求
    FORWARD 拦截转发(只拦截转发)
    INCLUDE 拦截包含
    ERROR   拦截错误页面
</dispatcher>
</filter-mapping> 

7、过滤的路径

  1  /具体路径   /TestServlet  只有访问TestServlet才会经过这个过滤器

       2  /*          过滤所有请求

       3  *.do        过滤所有结尾是 .do的请求

8、有很多路径需要过滤时

  将这些文件统一放入一个文件夹,如aaa  这时过滤路径写  /aaa/*  就可以了

监听器

1、监听器是一个对象,用来监听另一个对象的变化。

2、web监听器(3类,8个)

  Listener 是JavaEE 中Servlet规范下的一个组件

  用来监听ServletRequest  HttpSession  ServletContext这个三个域对象。

3、监听器在web.xml中的配置

<listener>
       <listener-class>路径</listener-class>
</listener>

4、第一类:监听域对象的生命周期  

  ServletContextListener,监听ServletContext的生命周期

public class MyServletContextListener implements ServletContextListener {
      /*
        * 监听ServletContext的生命周期(创建和销毁)
        * */
    public void contextInitialized(ServletContextEvent arg0) {
        //ServletContext创建时调用的方法    
        System.out.println("ServletContext 创建了....");
    }
    public void contextDestroyed(ServletContextEvent arg0) {
        //ServletContext销毁时调用的方法
        System.out.println("ServletContext 销毁了....");
    }
}         

  HttpSessionListener,监听Session的生命周期

public class MySessionListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent arg0) {        
        //arg0.getSession(); 获取事件源    
            System.out.println("Session创建了<<<<<");
    }
    public void sessionDestroyed(HttpSessionEvent arg0) {
            System.out.println("Session销毁<<<<<");
    }
}

  ServletRequestListener

public class MyRequestListener implements ServletRequestListener {
    public void requestInitialized(ServletRequestEvent arg0) {
        System.out.println("request创建了###");    
    }
    public void requestDestroyed(ServletRequestEvent arg0) {
        System.out.println("request销毁了###");
    }
}

4、第二类:监听值的变化

ServletContextAttributeListener

public class MyScAttrListener implements ServletContextAttributeListener {
    public void attributeAdded(ServletContextAttributeEvent arg0) {
        System.out.println("向SC中添加了一个值...");
    }
    public void attributeRemoved(ServletContextAttributeEvent arg0) {
        System.out.println("从SC中移除一个值<<<");
    }
    public void attributeReplaced(ServletContextAttributeEvent arg0) {
        System.out.println("替换了SC中的一个值###");
    }
}

 HttpSessionAttributeListener

public class MySessionAttrListener implements HttpSessionAttributeListener {
    public void attributeAdded(HttpSessionBindingEvent arg0) {    
       System.out.println("向Session中添加了一个值");
    }
    public void attributeRemoved(HttpSessionBindingEvent arg0) {    
       System.out.println("从Session中移除一个值");
    }
    public void attributeReplaced(HttpSessionBindingEvent arg0) {    
        System.out.println("替换Session中的值");
    }
}

ServletRequestAttributeListener

public class MyRequestAttributeListener implements ServletRequestAttributeListener {
    public void attributeAdded(ServletRequestAttributeEvent arg0) {
        System.out.println("request添加");
    }
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        System.out.println("request移除");
    }
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        System.out.println("request替换");    
    }
}

5、第三类:监听JavaBean中的对象,部需要配置

  在bean包的类中加上

public void valueBound(HttpSessionBindingEvent arg0) {    
        System.out.println("对象绑定到了Session中");    
}
public void valueUnbound(HttpSessionBindingEvent arg0) {    
        System.out.println("对象从Session中移除");
}