• JavaWeb三大组件——过滤器的运行机制理解


    过滤器Filter

      文章前言:本文侧重实用和理解。

    一.过滤器的概念。

      lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
     
    二.过滤器的运行机制。
       没有加Filter的web项目运行机制如下:
        加上Filter的web运行机制:
      由此可见:Filter的作用就是绿色网站,保护网站,实现访问权限的控制等等。
    三.怎样实现一个Filter。
    •   编写一个类实现Filter接口了。
    •   配置Filter
      <!-- 配置过滤器 -->
      <filter>
      	<!-- 过滤器名称 -->
      	<filter-name>FilterDemo1</filter-name>
      	<!-- 过滤器的类的全路径 -->
      	<filter-class>cn.itcast.filter.FilterDemo1</filter-class>
      </filter>
      
      <!-- 配置过滤器映射 -->
      <filter-mapping>
      	<!-- 过滤器名称 -->
      	<filter-name>FilterDemo1</filter-name>
      	<!-- 过滤器路径 -->
      	<url-pattern>/*</url-pattern>
      </filter-mapping>
    

      

      <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
      <filter-class>元素用于指定过滤器的完整的限定类名。

        <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数

      <url-pattern>标签的配置:

        * 完全路径匹配 :以 / 开始的. 如 /aa  /bb /aa/bb...

        * 目录匹配    :以 / 开始的. 以 * 结束.如 /* /aa/* /aa/bb/*

        * 扩展名匹配  :不能以 / 开始的. 如 *.jsp  *.do  *.action

      配置Filter之后,在服务器调用Servlet之前,会自动寻找与自身路径相匹配的过滤器路径,匹配之后,则执行过滤器。无匹配,则直接调用Servlet。

    四.过滤器链的概念。

      通常客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。

        每个过滤器实现某个特定的功能,一个过滤器检测多个Servlet。(匹配几个,检测几个)。

      一组过滤器中的执行顺序与<filter-mapping>的配置顺序呢有关。

      当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

    五.过滤器的生命周期。
      
      生命周期图:
      
      三种方法:
      
      linit(FilterConfig filterConfig)throws ServletException:
        和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法进行初始化(注:filter对象只会创建一次,init方也只会执行一次 )。
        开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。(filterConfig对象见下页PPT)ldoFilter(ServletRequest,ServletResponse,FilterChain)每次filter进行拦截都会执行在实际开发中方法中参数request和response通常转换为HttpServletRequest和HttpServletResponse类型进行操作。
      
      doFilter(ServletRequest,ServletResponse,FilterChain):
        每次filter进行拦截都会执行。
        在实际开发中方法中参数request和response通常转换为HttpServletRequest和HttpServletResponse类型进行操作。
     
      destroy():
        在Web容器卸载 Filter 对象之前被调用。
    六.过滤器链的运行机制。
      
      分析运行机制:
    •    Filter里面的doFilter是Filter实例的doFilter(request,response)方法。
    •  这条责任链的运行次序依次是:代码1,代码3,代码5,Servelt、web资源..,代码6,代码4,代码2;就是因为它的头尾相呼应的机制,所以才叫它责任链。
    •  在Filter中,如果你不调用chain.doFilter(request,response)方法,就表示此次请求被拒绝,返回目标路径。 

    七.获取web.xml文件中Filter的配置信息。

      方法的调用对象:

      init(FilterConfig filterConfig)方法中的filterConifg对象.

      方法:

        getFilterName():获得过滤器名称

        getInitParameter(String name):获得过滤器的初始化参数

        getInitParameterNames():获得过滤器的所有初始化参数的名称

        getServletContext():获得ServletContext对象

      

     
     
     
  • 相关阅读:
    JavaCC 研究与应用( 8000字 心得 源程序)
    推荐UML插件Green UML、AmaterasUML
    Custom PMD Rules
    静态分析工具及使用总结(三)
    静态分析工具及使用总结(二)CheckStyle
    静态分析工具及使用总结(一)
    基于antlr的表达式解析器——函数类型验证
    基于antlr的表达式解析器——函数生成(通过freemarker)
    网络流--最大流--hlpp(预流推进)模板
    网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
  • 原文地址:https://www.cnblogs.com/bzx888/p/4878971.html
Copyright © 2020-2023  润新知