什么是Filter?
- 1,JavaWeb三大组件之一
- 2,是JavaEE的规范,也就是接口
- 3,作用:拦截请求,过滤响应
使用步骤:
- 1,编写一个类实现Filter接口
- 2,实现过滤方法doFilter()
- 3,到web.xml配置Filter的拦截路径
public class FilterDemo implements Filter {
public void destroy() {
System.out.println("Filter destroy");
}
/*
专门用于拦截请求,可以做权限检查
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器被调用");
//让程序继续往下访问用户的目标资源
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("Filter init");
}
}
web.xml:
<!-- filter标签用于配置一个Filter过滤器-->
<filter>
<!-- 给Filter起一个别名-->
<filter-name>FilterDemo</filter-name>
<!-- 配置一个Filter的全类名-->
<filter-class>com.FilterDemo</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>Tom</param-value>
</init-param>
</filter>
<!-- filter-mapping配置filter拦截过滤器的拦截路径-->
<filter-mapping>
<!-- 表示当前的拦截路径给那个filter使用-->
<filter-name>FilterDemo</filter-name>
<!-- 配置拦截路径-->
<!-- "/"表示地址为:http://ip:port/工程路径/ 映射到web目录-->
<url-pattern>/*</url-pattern>
</filter-mapping>
生命周期:
- 构造器方法
- init初始化方法:在工程创建时调用
- doFilter过滤方法:每次拦截请求会调用
- destroy销毁:停止web工程时调用
FilterConfig类:过滤器的配置文件类
作用:获取Filter过滤器的配置信息
- 获取Filter的名称 filter-name的内容
- 获取在Filter中配置的init-param初始化参数
- 获取ServletContext对象
public class FilterDemo implements Filter {
public void destroy() {
System.out.println("Filter destroy");
}
/*
专门用于拦截请求,可以做权限检查
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器被调用");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("Filter init");
//1,获取Filter的名称 filter-name的
System.out.println("filter-name的内容:"+config.getFilterName());
//2,获取在Filter中配置的init-param初始化参数
System.out.println("init-param初始化参数:"+config.getInitParameter("name"));
//3,获取ServletContext对象
System.out.println("获取ServletContext对象:"+config.getServletContext());
}
}
FilterChain过滤器链
FilterChain就是多个过滤器如何一起工作
作用:
- 1,执行下一个Filter过滤器(如果有Filter)
- 2,执行目标资源(没有Filter)
执行流程:
- 在多个Filter过滤器执行时,它们执行的优先顺序由他们在web.xml从上到下配置顺序决定
多个Filter过滤器执行时的特点:
- 1,所有filter和目标资源默认都执行在同一个线程中
- 2,多个filter共同执行时,他们使用同一个Request对象
Filter匹配方式
- 1,精确匹配:
<url-pattern>/hello.html<url-pattern/>
http://ip:port/工程名/hello.html
- 2,目录匹配:
<url-pattern>/*<url-pattern/>
http://ip:port/工程名/*
- 3,后缀名匹配:
<url-pattern>*.html<url-pattern/>