目录
Filter过滤器
–1,概述
用来过滤请求或者响应
当A请求B时,可以在中间添加一个过滤器
当A给B做出响应时,可以在中间添加一个过滤器
–2,使用步骤
1, 创建类implements Filter接口
2, 重写抽象方法doFilter
3, 能否触发过滤器
–3,创建过滤器
package cn.tedu.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//创建过滤器:implements Filter+重写抽象方法
@WebFilter("/*")//拦截所有请求
public class Filter1 implements Filter {
//销毁,执行1次
public void destroy() {
}
//类似于Servlet的service(),会被执行多次
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器开始执行任务~~");
chain.doFilter(req, resp);//放行,解除阻塞状态
}
//初始化,执行1次
public void init(FilterConfig config) throws ServletException {
}
}
–4,测试
直接浏览器访问Servlet就可以触发过滤器的规则
–5,Filter生命周期
package cn.tedu.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//创建过滤器:implements Filter+重写抽象方法
@WebFilter("/*")//拦截所有请求
public class Filter1 implements Filter {
//第三阶段,销毁阶段,Filter会自动调用destroy(),只会执行1次
public void destroy() {
System.out.println("filter被销毁~~~");
}
//第二阶段,类似于Servlet的service()服务阶段,会被Filter执行多次
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器开始执行任务~~");
chain.doFilter(req, resp);//放行,继续访问目标资源,否则目标资源无法执行
}
//第一阶段,初始化阶段,Filter会自动调用init(),只会执行1次
public void init(FilterConfig config) throws ServletException {
System.out.println("filter被初始化完成~~~");
}
}
–6,测试
–7,过滤器的匹配规则
可以有4种配置方式:
1,具体文件: /index.jsp ,是指只有访问index.jsp这一个资源时,过滤器会被执行
2,匹配前缀: /user/* ,是指访问user下的所有资源时,过滤器会被执行
3,匹配后缀: * .jsp, 是指访问所有后缀名为jsp的文件时,过滤器会被执行
4,匹配所有: /* ,是指访问所有资源时,过滤器会被执行
package cn.tedu.filterdemo;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@WebFilter("/hello1.html") //只拦截固定资源
//@WebFilter("/user/*") //按照请求前缀拦截
//@WebFilter("*.jsp") //按照请求后缀拦截
@WebFilter("/*") //啥都拦截
public class Filter4 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filter doFilter....");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
FilterChain过滤器链
执行顺序:
有多个过滤器配置时,依次按照:
过滤器1
过滤器2
执行资源
过滤器2
过滤器1
过滤器的先后顺序
注解配置: 哪个过滤器将会先被执行,会按照类名的字符串比较规则,较小的先执行.如: AFilter先于BFilter执行,Filter3先于Filter4执行
web.xml配置: 依次按照的顺序执行,谁在上面就先执行谁