Filter & Listener——概述、应用、Filter的使用 & 细节

目录

  • Filter

    • Filter概述
    • Filter的作用
    • Filter的应用
    • Filter的开发和使用
    • Filter的细节
  • Listener

    • Listener概述
    • Listener编写步骤
    • ServletContextListener
    • 加载配置文件

Filter概述

跳转到目录
过滤器:一个拥有过滤/拦截功能的东西,过滤掉一些不想要的,不和谐的东西.
生活中的过滤器:香烟过滤嘴,滤纸,净水器,空气净化器,丈母娘,土匪等. 大多数都是单向过滤器.
Web中的过滤器(Filter):Web中的一个组件/程序,就好比Servlet,过滤器就是一个特殊的类. 双向,拦截请求,拦截响应.

Filter的作用

跳转到目录
过滤器可以对所有的请求或者响应做拦截操作.

  1. 以常规的方式调用资源(Servlet/JSP);
  2. 利用修改过的请求信息调用资源;
  3. 调用资源之后,但在响应到客户端之前,对响应做出修改;
  4. 阻止当前资源调用,代之转到其他资源.

Filter & Listener——概述、应用、Filter的使用 & 细节_第1张图片

过滤器的应用

跳转到目录
完成通用的操作

在开发中两个重要的思想:

  • DRY原则: Don’t Repeat Yourself. 开发中拒绝代码重复(因为重复会带来巨大的维护成本)
  • 责任分离原则: 各自做各自最擅长的事情.

一、可以对请求中的字符做编码
Filter & Listener——概述、应用、Filter的使用 & 细节_第2张图片
二、登录验证过滤器
Filter & Listener——概述、应用、Filter的使用 & 细节_第3张图片
三、敏感字符处理
Filter & Listener——概述、应用、Filter的使用 & 细节_第4张图片

Filter的开发和使用

跳转到目录

Servlet的开发和使用

Servlet的开发和使用:
1):定义类实现javax.servlet.Servlet接口,并覆盖该接口中的方法.
2):在service方法中编写处理请求和响应的代码.
3):在web.xml中,配置Servlet,告诉Tomcat来管理当前Servlet.

  <servlet>
         <servlet-name>ABCservlet-name>
         <servlet-class>Servlet的全限定名称servlet-class>
  servlet>
  <servlet-mapping>
         <servlet-name>ABCservlet-name>
         <url-pattern>/资源名url-pattern>
  servlet-mapping>

注意:此时url-patternt,表示外界访问Servlet的名称.

Filter的开发和使用

Filter的开发和使用:
1):定义类实现javax.servlet.Filter接口,并覆盖该接口中的方法.
2):在doFilter方法中编写处理过滤请求和过滤响应的代码.
3):在web.xml中,配置Filter,告诉Tomcat来管理当前的Filter.

<filter>
      <filter-name>ABCfilter-name>
      <filter-class>Filter的全限定名称filter-class>
filter>
<filter-mapping>
      <filter-name>ABCfilter-name>              
   	  <url-pattern>/资源名url-pattern>
filter-mapping>

注意:此时url-patternt,表示对哪些资源做过滤/拦截.

url-pattern的文本内容, 如:
1: /hello.jsp --------------------> 当前Filter就仅仅只对hello.jsp资源做拦截.
2: /index --------------------> 当前Filter就仅仅只对/index资源做拦截.
3:/* --------------------> 当前Filter就对所有资源做拦截.访问任意的资源,都会先进入该过滤器器.
4:/system/* --------------------> 当前Filter就对以/system/打头的资源做拦截.
/system , /system/a, /system/a/b/c, /systema.

注解配置: @WebFilter("/*")

过滤器细节

跳转到目录

1. 过滤器执行流程
  1. 请求先经过过滤器
  2. 经过过滤器过滤后再请求资源
  3. 请求完资源后再回到过滤器

注:两个经过过滤器会对request对象请求数据进行增强,对response对象响应数据进行增强(即过滤数据)
Filter & Listener——概述、应用、Filter的使用 & 细节_第5张图片

2. 生命周期方法
  • init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行
  • doFilter(ServletRequest,ServletResponse,FilterChan) :代表filter执行过滤的核心方法,如果某资源在已 经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行
  • doFilter方法 destory() :代表是filter销毁方法 当filter对象销毁时执行该方法
@WebFilter("/*")
public class FilterDemo3 implements Filter {

    /**
     * 每一次请求被拦截资源时,会执行
     * @param req
     * @param resp
     * @param chain
     * @throws ServletException
     * @throws IOException
     */
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("FilterDemo3.doFilter..执行..");
        chain.doFilter(req, resp);
        System.out.println("FilterDemo3.doFilter..放行..");
    }

    /**
     * 在服务器启动后,会创建Filter对象,然后调用init方法. 只会执行一次. (加载资源)
     * @param config
     * @throws ServletException
     */
    public void init(FilterConfig config) throws ServletException {
        System.out.println("FilterDemo3.init");
    }

    /**
     * 在服务器关闭后,Filter对象被销毁.如果服务器是正常关闭,则执行destroy方法 (释放资源)
     */
    public void destroy() {
        System.out.println("FilterDemo3.destroy");
    }
}
3. 过滤器配置详解
  • 【1】拦截路径配置

    • 具体资源路径:/index.jsp ==> 只有访问index.jsp资源时,过滤器才会被执行
    • 拦截目录:/user/* ==> 访问/user下的所有资源时,过滤器都会被执行
    • 后缀名拦截:*.jsp ==> 访问所有后缀名问jsp资源时,过滤器都会被执行
    • 拦截所有资源:/* ==> 访问任何资源,过滤器都会被执行
  • 【2】拦截方式的配置

    • 注解配置(设置配置文件的 dispatcherTypes 属性)
      REQUEST:默认值,浏览器直接请求资源
      FORWARD:转发访问资源
      INCLUDE:包含访问资源
      ERROR:错误跳转资源
      ASYNC:异步访问资源
    • web.xml配置
      配置标签即可
    //浏览器直接请求index.jsp资源时,该过滤器会被执行
    //@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
     
    //只有转发index.jsp资源时,该过滤器才会被执行
    //@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
     
    //浏览器直接请求index.jsp资源,转发index.jsp资源时,该过滤器会被执行
    @WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
    
    
4. 过滤器链(配置多个过滤器)

璐璐从广州开车到长沙,途径韶关收费站,株洲收费站。韶关收费站收的是路过韶关的费用,株洲收费站收的是路 过株洲的费用。如果这二座收费站业务通过了,方可到达长沙,只要其中一个收费站的业务没有通过,那么就不能 到达长沙。而且,只有通过了韶关收费站,才能到达株洲收费站。
同样,我们java代码中,有时需要对同一个请求,进行多次不同业务的过滤,所以我们java代码中需要多个过滤 器。只有所有的过滤器都对请求进行了放行,请求才能访问到目标资源,只要多个过滤器中只有一个过滤器不放行 请求,那么这个请求都不能够访问到目标资源。多个过滤器组成的一个整体我们称为过滤器链。而且,过滤器链中 的过滤器是一个一个的执行的,一个过滤器执行完毕之后,会执行下一个过滤器,后面没有过滤器了,才会访问到 目标资源。只要其中一个过滤器没有放行,那么这个过滤器后面的过滤器也都不会执行了。
Filter & Listener——概述、应用、Filter的使用 & 细节_第6张图片

  • 【1】执行顺序

    1. 过滤器1
    2. 过滤器2
    3. 资源执行
    4. 过滤器2
    5. 过滤器1
  • 【2】过滤器先后顺序

    1. 注解配置:按照类名的字符串比较规则进行比较,值小的先执行
      eg:AFilter 和 BFilter,AFilter 先执行
    2. web.xml:中谁定义在上面就先执行谁

Filter & Listener——概述、应用、Filter的使用 & 细节_第7张图片

Listener

跳转到目录
Web中的一个组件/程序,类似于Servlet/Filter;监听器就是监听某个对象的的状态变化的组件 监听器的相关概念.

事件源:被监听的对象 ----- 主要三个域对象 request session servletContext
监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器
响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码

Web中的监听器 : 主要用于监听作用域对象的创建; 监听作用域对象属性的添加/删除/替换;
在这里插入图片描述
一、监听作用域对象的创建和销毁

ServletReuestListener: 监听请求对象的创建和销毁.
HttpSessionListener: 监听会话对象(session)的创建和销毁.
ServletContextListener: 监听应用的创建和销毁.

二、监听作用域对象的属性的添加/删除/替换

ServletReuestAttributeListener: 监听request作用域中属性的添加/删除/替换
HttpSessionAttributeListener: 监听session作用域中属性的添加/删除/替换
ServletContextAttributeListener: 监听application作用域中属性的添加/删除/替换

监听器的编写步骤

跳转到目录

  1. 编写一个监听器类去实现监听器接口
  2. 覆盖监听器的方法
  3. 需要在web.xml(注解)中进行配置
    web.xml配置
     <listener>
     	
         <listener-class>com.sunny.web.listener.ContextLoaderListenerlistener-class>
     listener>
    

注意: Listener没有自己的初始化参数. Listener如果需要使用初始化参数,只能使用全局的初始化参数.

ServletContextListener

跳转到目录
ServletContextListener:用于监听ServletContext域的创建与销毁的监听器

应用场景服务器启动时,加载配置信息

ServletContext域的生命周期:

  • 何时创建:服务器启动创建
  • 何时销毁:服务器关闭销毁
  • 作用范围:整个web应用

加载配置文件

跳转到目录

  • web.xml
  
  <context-param>
      <param-name>contextConfigLocationparam-name>
      <param-value>/WEB-INF/classes/applicationContext.xmlparam-value>
  context-param>
  • 使用ServletContextListener来加载配置文件
public class ContextLoaderListener implements ServletContextListener {
    /**
     * 监听ServletContext对象创建的. ServletContext对象服务器启动后自动创建
     *
     * 在服务器启动后自动调用
     * @param servletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        // 加载资源文件
        //1. 获取ServletContext对象
        ServletContext servletContext = servletContextEvent.getServletContext();
        //2. 加载资源文件
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        //3. 获取真实路径
        String realPath = servletContext.getRealPath(contextConfigLocation);
        //4. 加载进内存
        try {
            FileInputStream fis = new FileInputStream(realPath);
            System.out.println(fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("Web系统启动了...........");
    }

    /**
     * 在服务器关闭后,ServletContext对象被销毁. 当服务器正常关闭后该方法被调用
     * @param servletContextEvent
     */
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("Web系统关闭了...........");
    }

你可能感兴趣的:(JavaWeb,Filter,Listener,Filter细节)