• 过滤器(Filter)


    过滤器(Filter)

    1. 基本概念

    过滤器(Filter)是拦截 Request 请求的对象:在用户的请求访问资源前处理 ServletRequest 和 ServletResponse 。

    Filter 相关的接口有:Filter、FilterConfig、FilterChain 。

    Filter 的实现必须实现 Filter 接口。这个接口包含了 Filter 的3个生命周期方法init()doFilter()destroy()

    Servlet 容器(Tomcat)初始化Filter时,会触发 Filter 的 init() 方法,一般来说是在应用开始时(注意,不是第一次使用时)。这个方法只会被调用一次。

    FilterConfig 对象由 Servlet 容器传入 init() 方法中。

    当 Servlet 容器每次处理 Filter 相关的资源时,都会调用该 Filter 实例的 doFilter() 方法。就像容器调用 Serviet 的 service() 方法。

    在 Filter 的 doFilter() 方法中,最后一行需要调用 FilterChain 中的 doChain() 方法。注意,FilterChain 是 doFilter() 方法的第三个参数。

    一个 URL 资源可能被多个 Filter 关联(即一条 Filter 链),这时 Filter.doFilter() 的方法将触发 Filter 链中下一个 Filter。只有在 Filter 链中最后一个 Filter 里调用 doFilter() 方法,才会触发 Controller 中处理 URL 资源的方法。

    如果在 Filter 的 doFilter() 方法中,因为故意(或无意)没有调用 FilterChain 的 doFilter() 方法,那么这个 Request 请求将终止,后面的处理就会中断。

    注意,FilterChain 接口中,唯一的方法就是 doFilter() 方法,它和 Filter 接口中的 doFilter() 方法定义是不一样的。

    Filter 接口中,最后一个方法是 destroy(),该方法在 Servlet 容器要销毁 Filter 时触发。

    类似于 Servlet,Filter 也是单例。

    2. Filter 的配置

    和 Servlet 的配置非常相似,Filter 的配置主要有三方面:

    • 确认哪些资源需要本 Filter 进行拦截处理。
    • 配置 Filter 的初始化参数和值,这些参数在 Filter 的 init() 方法中可以读取到。
    • 给 Filter 取一个名称(一般来说这个配置是不需要的)。在一些特殊的情况下,系统通过这个名字来识别Filter。
    @WebFilter(filterName = "firstFilter",
                urlPatterns = {"/*"},
                initParams = {
                    @WebInitParam(name="", value=""),
                    @WebInitParam(name="", value="")
                })
    public class FirstFilter implements Filter {
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    <filter>
        <filter-name>firstFilterfilter-name>
        <filter-class>com.hemiao.filter.FirstFilterfilter-class>
        <init-param>
            <param-name>authorparam-name>
            <param-value>benparam-value>
        init-param>
        <init-param>
            <param-name>emailparam-name>
            <param-value>hemiao3000@126.comparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>firstFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    视频m4v怎么转换成mp4?
    子类对象构造与析构的过程
    注意分号 ; 的在语法节奏感
    数据结构 栈与队列详解!!
    阿里云服务器部署Dubbo框架入门教程(SpringBoot+zookeeper+dubbo)
    基于Jaccard相似度的推荐算法---示例
    springboot注解方式,@Autowire和有参构造和无参构造使用哪个创建对象
    [附源码]计算机毕业设计大学生心理健康测评系统
    【光学】基于matlab色散曲线拟合【含Matlab源码 2053期】
    【C++】构造函数初始化列表的特性以及注意事项
  • 原文地址:https://blog.csdn.net/m0_73393501/article/details/136210593