Filter过滤器

1、介绍

1.1 什么是Filter

Filter是JavaWeb的三大组件(Servlet、Listener、Filter)之一;它是JavaEE的规范;

作用是:拦截请求,过滤响应。

常见的应用场景有:

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

1.2 工作流程

网页上某些页面或数据需要用户登录之后才能访问,使用Filter过滤器来过滤掉那些未登录的用户,避免该用户访问,只允许已登录的用户进行访问。

工作流程:
在这里插入图片描述

1.3 使用步骤

  1. 编写一个类去实现 Filter 接口 ;

  2. 实现过滤方法 doFilter();

    public class MyFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
            HttpSession session = httpServletRequest.getSession();
            User user = (User) session.getAttribute("user");
            if(user == null){  //说明用户没有登录
                //将用户页面跳转到登录页面
                httpServletRequest.getRequestDispatcher("/pages/login.jsp").forward(servletRequest,servletResponse);
                return;
            } else{
                //如果登录成功,说明该用户具有访问固定资源的权限
                filterChain.doFilter(servletRequest,servletResponse);
            }
        }
    }
    
  3. 到 web.xml 中去配置 Filter 的拦截路径

    <filter>
        <filter-name>myServlet</filter-name>
        <filter-class>com.wei.config.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myServlet</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    

    <url-pattern>为配置拦截路径:

    • / 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
    • /admin/* 表示请求地址为:http://ip:port/工程路径/admin/*
    • *:表示所有类型的文件

1.4 生命周期

Filter过滤器的生命周期包括几个方法:

  1. 构造器方法;
  2. init初始化方法;
  3. doFilter()方法,每次遇到拦截请求时,就会执行该方法
  4. destroy()销毁方法,web工程停止后,就会销毁Filter过滤器

1.5 拦截路径

Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在。

<filter-mapping>
    <filter-name>myServlet</filter-name>
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

```为配置拦截路径

Filter过滤器包括三种拦截路径的匹配方式

  • 精确匹配:精确匹配到web目录下的某个具体的文件

    <url-pattern>/login.jsp</url-pattern>
    
  • 目录匹配

    <url-pattern>/admin/*</url-pattern>
    
    • / 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
    • /admin/* 表示请求地址为:http://ip:port/工程路径/admin/*
    • *:表示所有类型的文件
  • 后缀名匹配

    <url-pattern>*.html</url-pattern>
    <url-pattern>*.jsp</url-pattern>
    <!--分别表示具有html和jsp结尾的文件才能被访问到 -->
    

2、Filter过滤器中的类

2.1 FilterConfig 类

表示过滤器的配置类。FilterConfig类的源码如下所示

package javax.servlet;
import java.util.Enumeration;

public interface FilterConfig {
    //获取过滤器的名称
    String getFilterName();
	//获取Servlet的上下文对象
    ServletContext getServletContext();
	//获取web.xml中的init-paramter配置部分
    String getInitParameter(String var1);
	//获取init-paramter中的所有<param-name>标签中的值
    Enumeration<String> getInitParameterNames();
}

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

  • 获取 Filter 的名称 filter-name 的内容
  • 获取在 Filter 中配置的 init-param 初始化参数
  • 获取 ServletContext 对象
  • 获取init-paramter中的所有<param-name>标签中的值

2.2 FilterChain 过滤器链

FilterChain 过滤器链 描述的是多个过滤器如何进行工作。工作原理如下所示:
在这里插入图片描述

多个Filter过滤器执行的特点:

  • 所有Filter和目标资源默认都执行在同一个线程中;
  • 多个Filter共同执行的时候,它们都使用同一个Request请求对象。

FilterChain.doFilter()方法的作用

  1. 如果有Filter的话,就执行下一个Filter过滤器中的前置代码和chai.doFilter()方法;
  2. 如果后面没有Filter的话,就访问目标资源。

在多个Filter过滤器执行的时候,它们的执行顺序是根据web.xml中配置的Filter的顺序决定的。上面的Filter配置的执行在下面的Filter的执行的前面。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值