什么是Filter?
Filter,过滤器,是Servlet规范中一种非常重要的组件,用于在web应用程序中拦截请求和响应,以实现一些通用的处理逻辑。
使用 Filter
- 第一步:创建 Filter 类,实现 Filter 接口或继承 HttpFilter(推荐)。
- 第二步:重写 doFilter 方法。
- 第三步:在 web.xml 中配置 Filter。
Filter 的生命周期
Filter 由谁创建?生命周期由谁管理?
- 跟 Servlet 一样,Filter 由 Web 容器创建,生命周期由 Web 容器管理。
Filter 的生命周期分哪几步?
- 实例化。跟 Servlet 一样,由 Web 容器利用反射机制调用 Filter 的无参构造函数完成实例化。不同于 Servlet 的点是,Servlet 默认在第一次访问时才实例化,Filter 在 Web 容器启动时实例化。
- 初始化 (init)。实例化完成后,Web 容器调用 Filter 对象的 init 方法执行初始化。
- 过滤 (doFilter)。每次路径匹配的请求到来时,Web 容器调用 Filter 的 doFilter 方法拦截请求。
- 销毁 (destroy)。Web 容器关闭前, Web 容器调用 Filter 对象的 destroy 方法执行销毁前处理。
配置多个 Filter 拦截同一个请求
- 可以配置多个 Filter 按顺序拦截同一个请求。
- 这些 Filter 按顺序组成一个链条 FilterChain,是“责任链模式”的一个变体。
- 每个 Filter 依次对请求和响应拦截处理,通过调用 FilterChain 的 doFilter() 方法,将请求转发到下一个 Filter,最后一个 Filter 将请求传递给目标 Servlet 进行处理。
- Filter 在链条中的顺序由在 web.xml 中的配置顺序确定。
实现 FilterChain
实现思路:
- 用一个 List 按顺序保存所有 Filter
- 保存需要执行的 Servlet
- 用一个指针指向当前 Filter
优化思路:
- 用一个自定义 FilterProxy 类将 Servlet 包装起来
- 这样就可以把包装好的 Servlet,以 Filter 的形式加入到 filterList 中,代码更优雅