Filter 简明笔记

什么是 Filter

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

02-Filter过滤器的执行流程.png

比如需要登录我这个网站,才能访问我的 web 资源,而如果每个 web 资源都需要进行登录判断的话,那干脆将这一层提取出来放到 Filter 中来实现是否登录判断

Filter 快速入门

  1. 定义类,实现 Filter 接口,并重写其所有方法
  2. 配置 Filter 拦截资源的路径:在类上定义 @WebFilter 注解
  3. 在 doFilter 方法中输出一句话,并放行

PS:

  1. 和 Servlet 的开发非常相似
  2. Filter 是 web 的三大组件之一,项目结构中一般将其放在 web 文件夹下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.itheima.web.filter;  

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

@WebFilter("/*")
public class FilterDemo implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo...");
//放行
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}
@Override
public void destroy() {

}
}

注:@WebFilter("/*") 表示拦截所有资源

这里容易出现导错包的问题,如下所示:

1
2
3
4
5
6
7
package com.itheima.web.filter;  

//import java.util.logging.Filter; //错误的包
import javax.servlet.Filter;

public class FilterDemo implements Filter {
}

Filter 执行流程

02-Filter过滤器的执行流程.png

  1. 放行后访问对象资源,资源访问完成后,还会回到 Filter 中吗?会
  2. 如果回到 Filter 中,是重新执行还是执行放行后的逻辑呢?放行后的逻辑

执行放行前逻辑 ⇒ 放行 ⇒ 访问资源 ⇒ 执行放行后逻辑

1
2
3
4
5
6
7
8
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
//放行前逻辑;对request数据进行处理,response中还没有数据
System.out.println("FilterDemo...");
//放行
chain.doFilter(request,response);//访问到资源,response中有数据了

//放行后逻辑:对response数据进行处理
}

Filter 使用细节

Filter 拦截路径配置

  • 拦截具体的资源:/index.jsp:只有访问 index.jps 时才会被拦截
  • 目录拦截:/user/*
  • 后缀名拦截:/*.jsp
  • 拦截所有:/*

过滤器链

一个 Web 应用,可以配置多个过滤器,这多个过滤器称为过滤器链

03-Filter过滤器链.png

注解配置的 Filter,优先级按照过滤器类名(字符串)的自然排序。比如 FilterDemo1 就排在 FilterDemo2 的前面