目录
在多个FIlter过滤器执行的时候,它们的执行优先顺序是由他们在web.xml中从上到下配置的顺序决定!!!
什么时Filter过滤器
1、Filter 过滤器是 javaWeb 的三大组件之一。三大组件分别是:Servlet程序、Listener监听器、Filter过滤器。
2、Filter 过滤器它是 JavaEE 的规范。也是接口。
3、FIlter 过滤器它的作用是:拦截请求,过滤响应。
拦截请求常见操作:
1、权限检查
2、日记操作
3、事务管理
··· ···等等
Filter 过滤器的使用步骤:
1、编写一个类去实现 Filter 接口
2、实现过滤方法 doFilter()
import javax.servlet.*;
import java.io.IOException;
public class Main implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
/**
* 过滤器方法
* @param servletRequest 请求对象
* @param servletResponse 响应对象
* @param filterChain 过滤链对象
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//方法实现
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
3、到web.xml中去配置Filter的拦截路径 (也可以用注解的方式 @WebFilter() )
<?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:过滤器的别名 -->
<filter-name>Main</filter-name>
<!-- filter-class:实现Filter类 -->
<filter-class>Main</filter-class>
</filter>
<filter-mapping>
<!-- filter-name:过滤器对应的别名 -->
<filter-name>Main</filter-name>
<!-- url-pattern:此路径下及子目录下过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Filter 的生命周期
Filter 的生命周期包含几个方法
1、构造器方法
2、init 初始化方法
第 1、2 步,在web工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法
第 3 步,每次拦截到请求,就会执行
4、destroy 销毁
第 4 步,停止web工程的时候,就会执行(停止web工程,也会销毁FIlter过滤器)
FIlterConfig 类
FIlterConfig 类见名知意,它是 FIlter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FIlterConfig 类,这里包含了 FIlter 配置文件的配置信息。
FilterConfig 类的作用是获取 FIlter 过滤器的配置内容
1、获取 FIlter 的名称 filter-name 的内容
2、获取 Filter 中配置的 init-param 初始化参数
3、获取 ServletContext 对象
Filter 过滤器是如何工作的
在多个FIlter过滤器执行的时候,它们的执行优先顺序是由他们在web.xml中从上到下配置的顺序决定!!!
多个FIlter过滤器执行的特点:
1、所有 FIlter 和目标资源默认都执行在同一个线程中
2、多个 Filter 共同执行的时候,他们都使用同一个Request对象。
FilterChain 过滤器链对象
FilterChain.doFilter() 方法的作用:
1、如果有Filter ,执行下一个 Filter 过滤器
2、如果没有FIlter,执行目标资源
执行细节图
FIlter 的拦截路径
注:FIlter 过滤器它只关心请求的地址是否匹配,不关系请求的资源是否存在!!!
注:<url-pattern></url-pattern> 拦截路径是可以写多个的
精确匹配
<url-pattern>/target.jsp</url-pattern> 这个配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
目录匹配
<url-pattern>/admin/*</url-pattern> 这个配置的路径,表示请求地址必须为http://ip:port/工程路径/admin/* (目录下的)
后缀名匹配
<url-pattern>*.abc</url-pattern>
<url-pattern>*.text</url-pattern>
<url-pattern>*.png</url-pattern>
以上的配置路径必须是 必须以它们配置的后缀名结尾才会拦截到