Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器 。
Filter 过滤器它是 JavaEE 的规范,也就是接口。
Filter 过滤器它的作用是: 拦截请求,过滤响应。
拦截请求常见的应用场景有:
权限检查 、日记操作 、事务管理
Filter的使用
Filter 过滤器的使用步骤:
- 编写一个类去实现 Filter 接口
- 实现过滤方法 doFilter()
- 到 web.xml 中去配置Filter 的拦截路径
下面代码是实现Filter接口的一个实现类,并且重写了过滤方法,用户没有登录就跳转到登录界面,如果登录了就继续访问用户目标资源。
public class AdminFilter implements Filter {
/** * doFilter 方 法 , 专 门 用 于 拦 截 请 求 。 可 以 做 权 限 检 查 */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// 如 果 等 于 null , 说 明 还 没 有 登 录
if (user == null) {
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); return;
}
else { // 让 程 序 继 续 往 下 访 问 用 户 的 目 标 资 源
filterChain.doFilter(servletRequest,servletResponse);
}
}
}
下面是Filter的xml配置文件,
Filter的生命周期
- 构造器方法
- init 初始化方法 第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
- doFilter过滤方法 第 3 步,每次拦截到请求,就会执行
- destroy 销毁 第 4 步,停止 web 工程的时候,就会执行(停止 web工程,也会销毁 Filter 过滤器)
FilterConfig类
它是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
- 获取 Filter 的名称 filter-name 的内容 filterConfig.getFilterName()
- 获取在 Filter 中配置的 init-param 初始化参数 filterConfig.getInitParameter()
- 获取 ServletContext 对象
FilterChain 过滤器链
我们在上面的dofilter方法中看到,如果满足过滤器条件,就会执行filterChain.doFilter方法。
而filterChain.doFilter()方法有两个作用:
- 执行下一个Filter过滤器(如果有Filter)
- 执行目标资源(没有Filter)
注意:多个Filter过滤器执行时,是按照web.xml配置文件的上下顺序,执行Filter过滤器的顺序。
多个Filter过滤器执行的特点:
- 所有Filter和目标资源都默认在一个线程下执行。
- 多个Filter共同执行时,都使用一个Request对象。
Filter的拦截路径
精确匹配:
目录匹配:
后缀名匹配:
以上配置的路径,表示请求地址必须以.html 结尾才会拦截到 。
注意:Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在