概述
Filter是依赖于Servlet容器,属于Servlet规范的一部分,Filter的执行由Servlet容器回调完成,Filter的生命周期由Servlet容器管理。他实际的效果就是当请求来的时候经先做一些事情再到service,请求返回的时候也先做一些事情,最后返回给客户端。整体的流程大概是下边这个样子:
2 实战
2.1 版本声明
运行环境声明:
- JDK 1.8
- SprintBoot 2.6.2
- IntelliJ IDEA 2021.1.3 x64
2.2 目录展示
下边是我们的项目目录,用红框圈出的是我们要进行改动或者创建的文件。注意图中的FilterConfig类是过滤器的另外一种配置方式这里我们不使用,而是使用注解的方式。
2.3 创建controller类
关于controller类的创建也就是 HelloWorldController.java 文件的内容,和上一篇文章的一样大家可以直接复制过来:
实战篇:用 Junit 对 Controller 类进行单元测试(MockMvc详细注释)
2.4 创建过滤器类
接下来是主要的过滤器内容的书写,代码部分我加入了详细的注释大家可以对照着看一遍。这里我们写了两个过滤器。
首先是LogFilter01.java 文件:
package com.example.springboot01.utils;
import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// 配置注解,urlPatterns参数代表针对哪些请求要进行过滤;filterName参数为过滤器的名字,并且会按照命名进行排序,决定请求先过哪个过滤器
@WebFilter(urlPatterns = "/*", filterName = "logFilter01")
// 实现Filter接口
public class LogFilter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 请求到service前要干的一些事情
System.out.println("请求来了,我是Filter01!");
// 过滤链,传给写一个过滤器,或者没有下一个过滤器时,直接交给对应的service
filterChain.doFilter(servletRequest,servletResponse);
// 请求响应返回给客户端前要执行的一些事情
System.out.println("请求结束了,我是Filter01!");
}
@Override
public void destroy() {
}
}
接下来是LogFilter01.java文件:
package com.example.springboot01.utils;
import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// 配置注解,urlPatterns参数代表针对哪些请求要进行过滤;filterName参数为过滤器的名字,并且会按照命名进行排序,决定请求先过哪个过滤器
@WebFilter(urlPatterns = "/*", filterName = "logFilter02")
public class LogFilter02 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 请求到service前要干的一些事情
System.out.println("请求来了,我是Filter02!");
// 过滤链,传给写一个过滤器,或者没有下一个过滤器时,直接交给对应的service
filterChain.doFilter(servletRequest,servletResponse);
// 请求响应返回给客户端前要执行的一些事情
System.out.println("请求结束了,我是Filter02!");
}
@Override
public void destroy() {
}
}
2.5 配置Servlet注解扫描路径
在书写过滤器类的时候我们加入了 @WebFilter 注解,他不是Spring Boot注解,所以我们要进行注解扫描路径的配置具体来说是在 Springboot01Application.java 文件加入下面语句。
@ServletComponentScan("com.example.springboot01.utils")
如图:
结果展示
好了~