说实话,百度百科的解释干脆直接,直接引用一下。
filter, 它使用户可以改变一个request和修改一个response.
Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,filter其实是一个“servlet
chaining“(servlet 链).
(1)公共代码的提取
(2)可以处理request和response
(3)进行权限控制
(4)处理网站中文乱码问题
(5)实现自动登录
(6)过滤敏感词汇
(7)压缩网页
通过这张图,我们可以看到,我们即将要学习的filter处在什么位置,清晰明了。
通过上图,我们看到,filter做了两类事:
1、在请求request到达servlet之前,对request进行预处理;
2、在servlet发出响应信息response后,对响应信息response进行处理,然后返回给请求发起人。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
/**
*@Description: 第一个过滤器Filter
*@MethodName: MyFilter
*@Author: world
*@Date: 10/1/22 12:19 PM
*@Version: 1.0
**/
@Component
public class MyFirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("我是第一个servlet init,我是在服务启动时候被加载 1次 !");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是第一个filter----servlet处理请求之前!");
Object header = servletRequest.getAttribute("Header");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("这是第一个filter----servlet处理请求之后!");
}
@Override
public void destroy() {
System.out.println("我是第一个filter----destroy,我只在服务停止时被触发!");
}
}
/**
*@Description: 第二个过滤器filter
*@MethodName: MySecondFilter
*@Author: world
*@Date: 10/1/22 3:34 PM
*@Version: 1.0
**/
@Component
public class MySecondFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("我是第二个filter----servlet init,我是在服务启动时候被加载 1次 !");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是第二个filter----servlet处理请求之前!");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("这是第二个filter----servlet处理请求之后!");
}
@Override
public void destroy() {
System.out.println("我是第二个filter----destroy,我只在服务停止时被触发!");
}
}
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>MyFirstFilterfilter-name>
<filter-class>com.world.filter.filter.MyFirstFilterfilter-class>
filter>
<filter>
<filter-name>MySecondFilterfilter-name>
<filter-class>com.world.filter.filter.MySecondFilterfilter-class>
filter>
<filter-mapping>
<filter-name>MyFirstFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter-mapping>
<filter-name>MySecondFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
后面会基于此把filter能够实现的各类功能,逐一编写实现,与君共勉。