一、Filter 过滤器
============
1、概述
当访问服务器资源时,Filter 过滤器可以将请求拦截下来,完成一些特殊的处理,其作用一般用于完成一些通用的操作,比如:登录验证、统一编码处理、敏感字符过滤等
2、开发步骤
-
定义一个类,实现 Filter 接口
-
重写方法
-
配置拦截路径
-
web.xml配置
-
注解配置
3、过滤器执行流程
-
请求先经过过滤器
-
经过过滤器过滤后再请求资源
-
请求完资源后再回到过滤器
注:两个经过过滤器会对request对象请求数据进行增强,对response对象响应数据进行增强(即过滤数据)
4、过滤器生命周期
-
init()方法:在服务器启动后创建Filter对象,调用init方法,只执行一次,用于加载资源
-
doFilter()方法:每一次请求被拦截请求资源时调用,可执行多次
-
destory()方法:服务器正常关闭时调用distory方法销毁Filter对象,只执行一次,用于释放资源
@WebFilter("/*") //访问所有资源之前都会执行该过滤器
public class myFilter implements Filter {
/*
在服务器启动后创建Filter对象,调用init方法,只执行一次,用于加载资源
*/
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
/*
每一次请求被拦截请求资源时调用,可执行多次
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("oneStar");
//放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("BackoneStar");
}
/*
服务器正常关闭时调用distory方法销毁Filter对象,只执行一次,用于释放资源
*/
public void destroy() {
System.out.println("销毁");
}
}
5、过滤器配置问题
【1】拦截路径配置
-
具体资源路径:/index.jsp ==> 只有访问index.jsp资源时,过滤器才会被执行
-
拦截目录:/user/* ==> 访问/user下的所有资源时,过滤器都会被执行
-
后缀名拦截:*.jsp ==> 访问所有后缀名问jsp资源时,过滤器都会被执行
-
拦截所有资源:/* ==> 访问任何资源,过滤器都会被执行
【2】拦截方式的配置
- 注解配置(设置配置文件的 dispatcherTypes 属性)
-
REQUEST:默认值,浏览器直接请求资源
-
FORWARD:转发访问资源
-
INCLUDE:包含访问资源
-
ERROR:错误跳转资源
-
ASYNC:异步访问资源
- web.xml配置
- 配置<dispatcher></dispatcher>标签即可
//浏览器直接请求index.jsp资源时,该过滤器会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
//只有转发index.jsp资源时,该过滤器才会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//浏览器直接请求index.jsp资源,转发index.jsp资源时,该过滤器会被执行
@WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
public class myFilter implements Filter {
6、过滤器链(配置多个过滤器)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎徽关注公zhong号:编程进阶路 加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
【1】执行顺序
-
过滤器1
-
过滤器2
-
资源执行
-
过滤器2
-
过滤器1
【2】过滤器先后顺序
- 注解配置:按照类名的字符串比较规则进行比较,值小的先执行
eg:AFilter 和 BFilter,AFilter 先执行
- web.xml:<filter-mapping>中谁定义在上面就先执行谁