filter的前身今生
0、fiter是什么
说实话,百度百科的解释干脆直接,直接引用一下。
filter, 它使用户可以改变一个request和修改一个response.
Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,filter其实是一个“servlet
chaining“(servlet 链).
1、filter有啥用
(1)公共代码的提取
(2)可以处理request和response
(3)进行权限控制
(4)处理网站中文乱码问题
(5)实现自动登录
(6)过滤敏感词汇
(7)压缩网页
2、filter在哪里
通过这张图,我们可以看到,我们即将要学习的filter处在什么位置,清晰明了。
3、filter做了啥
通过上图,我们看到,filter做了两类事:
1、在请求request到达servlet之前,对request进行预处理;
2、在servlet发出响应信息response后,对响应信息response进行处理,然后返回给请求发起人。
4、filter代码实现
4.1 依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
4.2 代码
4.2.1 MyFirstfilter.java
/**
*@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,我只在服务停止时被触发!");
}
}
4.2.2 MySecondFilter.java
/**
*@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,我只在服务停止时被触发!");
}
}
4.3 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>MyFirstFilter</filter-name>
<filter-class>com.world.filter.filter.MyFirstFilter</filter-class>
</filter>
<filter>
<filter-name>MySecondFilter</filter-name>
<filter-class>com.world.filter.filter.MySecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFirstFilter</filter-name>
<url-pattern>/*</url-pattern>
<!-- /*是对所有的文件进行拦截 -->
</filter-mapping>
<filter-mapping>
<filter-name>MySecondFilter</filter-name>
<url-pattern>/*</url-pattern>
<!-- /*是对所有的文件进行拦截 -->
</filter-mapping>
</web-app>
5、运行结果
5.1 服务启动,filter被加载
5.2 有请求来,filter被触发
5.3 服务关停,filter被销毁
6、篇后语
后面会基于此把filter能够实现的各类功能,逐一编写实现,与君共勉。