一、什么是Java Web三大组件
Servlet、Filter(过滤器)、Listener(监听器)
二、Filter 概念
当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
三、Filter 使用
1.自定义类,实现 Filter 接口
2.设置拦截路径
3.配置
(1)web.xml 配置方式
① 自定义 Filter 类,实现 Filter 接口
package web.filter;
import javax.servlet.*;
import java.io.IOException;
public class FilterTest implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("我也拦截成功了......");
// 放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
② 配置 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>
<filter-name>test</filter-name>
<filter-class>web.filter.FilterTest</filter-class>
</filter>
<!--配置 filter 映射-->
<filter-mapping>
<!--选择配置好的 filter-->
<filter-name>test</filter-name>
<!--配置拦截路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
(2)注解 配置方式
package web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// 配置拦截路径, /* 表示全部拦截
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤中......");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
四、Filter 生命周期
- init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次;用于加载资源
- doFilter:每一次请求被拦截资源时,会执行;执行多次
- destroy:在服务器关闭后,Filter对象被销毁;如果服务器是正常关闭,则会执行destroy方法;只执行一次。用于释放资源
五、过滤器执行流程
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行代码下边的代码
六、过滤器拦截路径配置
- 具体资源路径 ===> /xxx.html 或其他
- 目录拦截 ===> /xxx/*
- 后缀名拦截 ===> *.jsp 或其他
- 拦截所有 ===> /*
七、过滤器拦截方式配置
资源被访问的方式
1.注解配置:
设置 @WebFilter 注解的 dispatcherTypes 属性
- REQUEST:默认值;浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
@WebFilter(urlPatterns = "/*", dispatcherTypes = DispatcherType.FORWARD)
2.web.xml配置
设置 web.xml 文件中 <dispatcher></dispatcher>标签即可
<!--配置 filter-->
<filter>
<filter-name>test</filter-name>
<filter-class>web.filter.FilterTest</filter-class>
</filter>
<!--配置 filter 映射-->
<filter-mapping>
<!--选择配置好的 filter-->
<filter-name>test</filter-name>
<!--配置拦截路径-->
<url-pattern>/*</url-pattern>
<!--配置过滤方式-->
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
八、过滤器链
即配置多个过滤器
1.执行顺序
如果有两个过滤器:过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
2.过滤器先后顺序问题
(1)注解配置
按照类名的字符串比较规则比较,值小的先执行
例如:
AFilter 和 BFilter,AFilter就先执行了
(2)web.xml配置
<filter-mapping> 中,谁定义在上边,谁先执行