在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。

FilterChain 接口

javax.servlet 包中提供了一个 FilterChain 接口,该接口由容器实现。容器将其实例对象作为参数传入 Filter 对象的 doFilter() 方法中。Filter 对象可以使用 FilterChain 对象调用链中下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。FilterChain 接口中只有一个方法,如下表。

返回值类型 方法 描述
void doFilter(ServletRequest request ,ServletResponse response) 使用该方法可以调用过滤器链中的下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。

在 Filter.doFilter() 方法中调用 FilterChain.doFilter() 方法的语句前后增加某些程序代码,就可以在 Servlet 进行响应前后实现某些特殊功能,例如权限控制、过滤敏感词、设置统一编码格式等。

Filter 链的拦截过程

Filter 链的拦截过程如下图所示。

请求资源时,过滤器链中的过滤器依次对请求进行处理,并将请求传递给下一个过滤器,直到最后将请求传递给目标资源。发送响应信息时,则按照相反的顺序对响应进行处理,直到将响应返回给客户端。

过滤器并不是必须要将请求传递到下一个过滤器或目标资源,它可以自行对请求进行处理,并发送响应给客户端,也可以将请求转发给其他的目标资源。

过滤器链中的任何一个 Filter 没有调用 FilterChain.doFilter() 方法,请求都不会到达目标资源。

Filter 链中 Filter 的执行顺序

通过 web.xml 配置的 Filter 过滤器,执行顺序由 <filter-mapping> 标签的配置顺序决定。<filter-mapping> 靠前,则 Filter 先执行,靠后则后执行。通过修改 <filter-mapping> 的顺序便可以修改 Filter 的执行顺序。

通过 @WebFilter 注解配置的 Filter 过滤器,无法进行排序,若需要对 Filter 过滤器进行排序,建议使用 web.xml 进行配置。

最新文章

  1. 马里奥AI实现方式探索 ——神经网络+增强学习
  2. MySQL 优化MySQL Server
  3. &lt;转&gt;MFC注册系统/全局热键。
  4. 最新Internet Download Manager (IDMan) 6.25 Build 20 32位 64位注册破解补丁
  5. IntelliJ IDEA 当pom.xml更新时,自动加载pom.xml
  6. 警告:Assigning to &#39;id&lt;Delegate&gt;&#39; from incompatible type &#39;ViewController *const_st
  7. javaWeb-mvc之利用c3p0写入数据库出现乱码
  8. 【USACO】checker
  9. JavaScript document
  10. iOS-开发日志-UIButton
  11. Android常见开源解决方案
  12. 当你还在争夺移动支付的时候,我已经统一了IC卡市场
  13. HDU 1004 MAP【STL__map_的应用】
  14. PHP 序列化与反序列化函数
  15. Microsoft office2010页码设置----论文、课程设计报告格式
  16. 实际用到的linux小方法
  17. 从零开始学安全(十四)●Windows Server 2012 R2 本地搭建FTP服务器
  18. [20171031]markhot.txt
  19. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 6. 条件
  20. Centos清除IP

热门文章

  1. 基于GDI和D3D的抓屏技术
  2. 使用.NET 6开发TodoList应用(8)——实现全局异常处理
  3. 【LeetCode】217. Contains Duplicate 解题报告(Java & Python)
  4. Interesting Fibonacci(hdu 2814)
  5. 《HelloGitHub》第 69 期
  6. A New Defense Against Adversarial Images: Turning a Weakness into a Strength
  7. 对比显示每条线路的价格和该类型线路的平均价格,分别使用子查询和 exists 获取线路数量
  8. 使用 jQuery 选择器获取页面元素,然后利用 jQuery 对象的 css() 方法设置其 display 样式属性,从而实现显示和隐藏效果。
  9. CAS学习笔记三:SpringBoot自动配置与手动配置过滤器方式集成CAS客户端
  10. Linux-saltstack-4 jinjia模板得基本使用