概念

Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等..…

快速入门

  1. 定义类,实现Filter接口,并重写其所有方法
    可以快速new Filter模板新建

  2. 配置Filter拦截资源的路径:在类上定义@WebFilter注解

    1. 也可以通过在web.xml中配置<filter-mapping>
    2. 拦截资源路径的过滤方式其实和Servlet的方式类似无非就是具体的有精确和模糊匹配,还有名称过滤和拓展名过滤
  3. 在doFilter方法中书写放行前和放行后逻辑代码,在逻辑中间书写放行代码

执行流程

代码实现

package com.itheima.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;


//@WebFilter("/hello.jsp")
@WebFilter("/*")
public class FilterDemo2 implements Filter {


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //1. 放行前,对 request数据进行处理
        System.out.println("2.FilterDemo...");

        //放行
        chain.doFilter(request,response);
        //2. 放行后,对Response 数据进行处理
        System.out.println("4.FilterDemo...");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }



    @Override
    public void destroy() {

    }
}

过滤器链

目的就是解耦,流水线的思想

image-20220910201651586

如果是通过xml配置文件配置的话就取决于web.xml的<filter-mapping>的顺序。

注意事项

过滤时候我们要选择性放行,比如登录验证案例里如果判断用户不存在跳转注册界面,此时要注意登录和注册页面都会有相应的CSS、js等文件,如果/*里判断直接通过用户不存在就全部拦截的话会导致页面失去原有的样子,此时我们应当添加一个免除过滤的资源路径数组再循环遍历比较拦截的资源是否在免除过滤资源路径数组中二选择放行,但最终在链式传递的过程中归来的时候(该过程好比递归,先递再归)最后回到最初的位置判断是不能放行登录的即可。