Filter过滤器(Filter filter)

1、过滤器三要素

  • 拦截:一个请求必须先把它拦住,才能做后续处理
  • 过滤:预设的检查条件,满足条件才可以放行
  • 放行:对于满足要求的请求,放它过去,让它原本要访问什么资源就继续还是访问那个资源

2、过滤器生命周期

生命周期环节 调用的方法 时机 次数
创建对象 无参构造器 默认:Web应用启动时 一次
初始化 init(FilterConfig filterConfig) 创建对象后 一次
处理请求 doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
接收到请求后 多次
清理操作 destroy() Web应用卸载之前 一次

3、拦截请求时的匹配规则

  • 精确匹配




    Target01Filter


    /Target01Servlet

<!-- 配置Filter要拦截的目标资源 -->
<filter-mapping>
    <!-- 指定这个mapping对应的Filter名称 -->
    <filter-name>Target01Filter</filter-name>

    <!-- 通过请求地址模式来设置要拦截的资源 -->
    <url-pattern>/Target01Servlet</url-pattern>
</filter-mapping>
  • 模糊匹配★

    前杠后星:/user/*


    Target02Filter



    /user/*

    前星后缀:*.html


    Target04Filter
    com.atguigu.filter.filter.Target04Filter


    Target04Filter
    *.png

  • 前杠后星:/user/*


    Target02Filter



    /user/*

<filter-mapping>
    <filter-name>Target02Filter</filter-name>

    <!-- 模糊匹配:前杠后星 -->
    <!--
        /user/Target02Servlet
        /user/Target03Servlet
        /user/Target04Servlet
    -->
    <url-pattern>/user/*</url-pattern>
</filter-mapping>
  • 前星后缀:*.html


    Target04Filter
    com.atguigu.filter.filter.Target04Filter


    Target04Filter
    *.png

<filter>
    <filter-name>Target04Filter</filter-name>
    <filter-class>com.atguigu.filter.filter.Target04Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Target04Filter</filter-name>
    <url-pattern>*.png</url-pattern>
</filter-mapping>
  • 根据Servlet名称匹配

4、Filter链

  • 概念:拦截同一资源的多个Filter
  • 执行顺序:由web.xml中filter-mapping配置的顺序决定
  • chain.doFilter(requset,response):将请求放行到Filter链中的一下一个Filter,如果当前Filter已经是最后一个了,那么直接放行这个请求去访问原本要访问的资源
————————

1. Three elements of filter

  • Intercept: a request must be blocked before subsequent processing
  • Filter: the preset inspection conditions are met before release
  • Release: for a request that meets the requirements, let it go and let it continue to access what resource it originally intended to access or access that resource

2. Filter life cycle

生命周期环节 调用的方法 时机 次数
创建对象 无参构造器 默认:Web应用启动时 一次
初始化 init(FilterConfig filterConfig) 创建对象后 一次
处理请求 doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
接收到请求后 多次
清理操作 destroy() Web应用卸载之前 一次

3. Matching rules when intercepting requests

  • 精确匹配




    Target01Filter


    /Target01Servlet

<!-- 配置Filter要拦截的目标资源 -->
<filter-mapping>
    <!-- 指定这个mapping对应的Filter名称 -->
    <filter-name>Target01Filter</filter-name>

    <!-- 通过请求地址模式来设置要拦截的资源 -->
    <url-pattern>/Target01Servlet</url-pattern>
</filter-mapping>
  • 模糊匹配★

    前杠后星:/user/*


    Target02Filter



    /user/*

    前星后缀:*.html


    Target04Filter
    com.atguigu.filter.filter.Target04Filter


    Target04Filter
    *.png

  • 前杠后星:/user/*


    Target02Filter



    /user/*

<filter-mapping>
    <filter-name>Target02Filter</filter-name>

    <!-- 模糊匹配:前杠后星 -->
    <!--
        /user/Target02Servlet
        /user/Target03Servlet
        /user/Target04Servlet
    -->
    <url-pattern>/user/*</url-pattern>
</filter-mapping>
  • 前星后缀:*.html


    Target04Filter
    com.atguigu.filter.filter.Target04Filter


    Target04Filter
    *.png

<filter>
    <filter-name>Target04Filter</filter-name>
    <filter-class>com.atguigu.filter.filter.Target04Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Target04Filter</filter-name>
    <url-pattern>*.png</url-pattern>
</filter-mapping>
  • 根据Servlet名称匹配

4、Filter链

  • Concept: intercept multiple filters of the same resource
  • 执行顺序:由web.xml中filter-mapping配置的顺序决定
  • chain. Dofilter (requset, response): release the request to the next filter in the filter chain. If the current filter is the last one, directly release the request to access the resources to be accessed