Filter的介绍

Filter过滤器是什么:Filter过滤器是JavaWeb的三大组件之一。它是JavaEE的规范。也就是接口

Filter过滤器的作用:拦截请求(主要),过滤响应。每当请求进来,都会先经过过滤器,我们可以在过滤器中加上自定义的功能,当请求满足某些条件时,才会通过过滤器继续往下访问,否则进行拦截。

拦截请求常见的应用场景有:

  • 权限检查
  • 日记操作
  • 事务管理
  • ...

Filter过滤器的使用步骤

  1. 编写一个类实现Filter接口
  2. 重写doFilter()方法,实现具体的需求
  3. 到web.xml中去配置Filter的拦截路径
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    /**
     * doFilter方法,专门用来拦截请求,过滤响应的。可以做权限检查
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //这里编写具体功能实现代码
    }
    @Override
    public void destroy() {
    }
}

其中init方法和destroy是初始化和销毁方法

xml配置

<!--  filter标签用于配置一个Filter过滤器  -->
<filter>
    <!--给Filter起一个别名-->
    <filter-name>AdminFilter</filter-name>
    <!--对应Filter的全类名-->
    <filter-class>com.zhiqian.filter.AdminFilter</filter-class>

    <!--配置Filter初始化参数-->
    <init-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </init-param>
</filter>
<!--配置Filter过滤器的拦截路径-->
<filter-mapping>
    <!--表示当前的拦截路径给哪个Filter使用-->
    <filter-name>AdminFilter</filter-name>
    <!--配置拦截路径
        / 表示请求地址为http://ip:port/工程路径/ 映射到IDEA的web目录
    -->
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

其中Filter的初始化参数可以省略

Filter的生命周期

Filter过滤器的生命周期会依次执行几个方法:

  1. 构造方法
  2. init初始化方法
  3. doFilter过滤方法
  4. destroy销毁方法

注意:

  • 第1、2步在web工程启动时执行,Filter就被创建了
  • 第3步每次拦截到请求就会执行
  • 第4步在web工程停止时执行,Filter被销毁

FilterConfig类

FilterConfig类是Filter过滤器的配置文件类,可以用来获取Filter过滤器的配置信息

Tomcat每次创建Filter的时候,也会创建一个FilterConfig类

相关方法:

  • getFilterName():获取Filter的名称(别名),就是filter-name的值
  • getServletContext():获取ServletContext对象
  • getInitParameter():获取在web.xml中配置的init-param 初识化参数

FilterChain类

FilterChain类:(过滤器链)就是多个过滤器如何一起工作

FilterChain类只有一个方法,就是doFilter()

FilterChain类的doFliter()的作用:

  1. 执行下一个Filter过滤器的doFilter方法(如果还有其他相同拦截路径的Filter)
  2. 执行请求路径的目标资源(没有其他相同拦截路径的Filter)

注意事项:多个相同拦截路径的Filter执行顺序,是由工程中的web.xml配置文件中从上往下配置的顺序决定的

多个Filter过滤器执行的特点

  1. 所有的Filter和目标资源默认都执行在同一个线程中
  2. 多个Filter共同执行时,它们使用的是同一个request对象,共享request域中数据

Filter过滤器的拦截路径

Filter过滤器的拦截路径有三种匹配方式:

1、 精确匹配

<url-pattern>/target.jsp</url-pattern>

以上这种就是精确匹配,请求的地址必须与上面的拦截地址一致
才会被拦截到

2、 目录匹配

<url-pattern>/admin/*</url-pattern>

以上这种就是目录匹配,请求的地址在上面拦截地址的目录(admin)中就会被拦截到

3、 后缀名匹配

<url-pattern>*.html</url-pattern>

以上就是后缀名匹配,只要请求访问后缀名为.html的资源就会被拦截到
注意:后缀名匹配,前面不要带 /

注意事项:

  1. 相同拦截路径的Filter必须是<url-pattern>中配置的路径相同。
  2. 如果当两个不同拦截路径的Filter遇到了一个二者都匹配的请求时,这时由web.xml中从上往下配置的顺序在决定谁去拦截请求。
  3. Filter过滤器它只关心请求的地址是否匹配,不关心服务器中是否存在该资源!
  4. 一个Filter过滤器可以配置多个拦截路径

ThreadLocal的使用

ThreadLocal可以解决多线程的数据安全问题,ThreadLocal它可以给当前线程关联一个数据(可以是普通变量、对象、数组、集合等)

ThreadLocal的特点:

  • ThreadLocal可以为当前线程关联一个数据。它可以像Map一样存取数据,key为当前线程)
  • 每个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要创建多个ThreadLocal对象实例。
  • 每个ThreadLocal对象实例定义的时候,一般都是用static修饰
  • ThreadLocal中保存的数据,在线程销毁后,由JVM虚拟机自动释放

ThreadLocal的应用

可以在JDBCUtils工具类的getConnection方法中将数据库连接池获取到的连接对象保存在ThreadLocal中。使Dao层中一系列的方法使用的是ThreadLocal中的Connection以用来确保一个业务中使用的多个Service方法使用的是同一个Connection对象保证事务的一致性

最后补充:

  1. 使用Filter过滤器统一给所有的资源都加上try-catch,来实现事务的管理以及让Tomcat展示自定义的错误页面
  2. 使用Tomcat统一管理异常,让Tomcat展示友好的错误页面,在web.xml文件中配置标签<error-page>在其中配置错误类型以及对应跳转的页面
最后修改:2021 年 06 月 06 日 02 : 27 PM
如果觉得我的文章对你有用,请随意赞赏