Filter过滤器

103 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Filter

Filter过滤器是JavaWeb三大组件之一。是JavaEE的规范,也就是接口,它的作用是拦截请求,过滤响应。

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

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

以权限检查为例:

web工程下的一部分目录中内容需用户登陆后才可访问

在之前,解决方法是在jsp页面中用Java判断session域是否为空,若为空则代表用户未登录,跳转至登陆页面。但此方法有局限性,在一些图片、视频资源中无法用java代码进行判断,所以我们选择使用Filter过滤器进行权限检查。

Filter检查步骤:

检查用户是否登录→已登录则让程序默认执行,未登录就控制程序流转,跳转至其他页面

import javax.servlet.*;//注意这里是javax包下的public class AdminFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException{
    
    }
    
    //doFilter方法,专门用于拦截请求,可以做权限检查
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain){
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        //然后就获取session域信息,判断是否登录
        
       //让程序继续往下访问用户的目标资源
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

在web.xml文件中配置Filter

<filter>
    <!-- 给filter起别名 -->
    <filter-name>AdminFilter</filter-name>
    <!-- 配置filter的全类名 -->
    <filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
<!-- 配置Filter过滤器的拦截路径 -->
<filter-mapping>
    <!-- 标识当前的拦截路径给哪个filter使用 -->
    <filter-name>AdminFilter</filter-name>
    <!-- 配置拦截路径
    /表示请求地址为:http://ip:port/工程路径/映射到IDER的web目录
    /admin/*表示请求地址为:http://ip:port/工程路径/admin/*     
-->
    <url-pattern>/</url-pattern>
</filter-mapping>
    
    

使用步骤总结:

  1. 编写一个类去实现Filter接口
  2. 实现过滤方法doFilter()
  3. 到web.xml中去配置Filter的拦截路径

Filter生命周期

Filter的生命周期包含以下方法:

  • 构造器方法
  • init初始化方法

前两个方法在web工程启动的时候执行(Filter已经创建)

  • doFilter过滤方法

第三个方法每次拦截到请求就会执行

  • destroy销毁方法

停止web工程的时候会执行

FilterConfig类

FilterConfig类是Filter过滤器的配置文件类,Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,这里包含了Filter配置文件的配置信息。

作用:

  • 获取Filter的名称filter-name的内容
  • 获取在Filter中配置的init-param初始化参数
  • 获取ServletContext对象

FilterChain过滤器链

FilterChain.doFilter()方法的作用

  1. 执行下一个Filter过滤器(如果有)
  2. 执行目标资源(没有Filter)

方法前后代码执行顺序:

Filter.jpg

注意:

  • 在多个Filter过滤器执行的时候,它们的执行顺序是由它们在web.xml中从上到下配置的顺序决定
  • 如果没有doFilter方法,则会直接反向回去
  • 所有filter和目标资源默认都执行在同一个线程中
  • 多个Filter共同执行的时候,它们都使用同一个Request对象。

拦截路径的三种配置方式

精确匹配:

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

目录匹配:

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

后缀名匹配:

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

后缀名匹配不能以“/”打头

Filter过滤器只关心请求的地址是否匹配,不关心请求的路径是否存在!