前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tomcat Filter 源码分析

Tomcat Filter 源码分析

作者头像
java404
发布2018-05-18 12:23:49
1.8K0
发布2018-05-18 12:23:49
举报
文章被收录于专栏:java 成神之路java 成神之路

Filter 概述

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。 通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

Filter工作流程图如下:

Tomcat中的Filter 是采用责任链设计模式 ,下面我们通过源码分析下tomcat中Filter的实现

StandardWrapperValve.invoke()方法

创建一个过滤器链,并把待执行的 servlet 对象存放到过滤器链中。

ApplicationFilterFactory.createFilterChain() 方法

  1. 把要执行的servlet存放到过滤器链中。
  2. 如果没有配置过滤器则return一个空的过滤器链(只包含上面设置的servlet)。
  3. 如果配置过滤器,则把所有配置的过滤器加入到过滤器链中 3.1 首先判断filter-mapping中配置的dispatcher规则,如果符合则进入下一步 3.2 然后判断filter-mapping中配置的url-pattern规则,如果符合则添加到过滤器链

过滤器的顺序是按照web.xml中的先后顺序执行的。

StandardWrapperValve.invoke()方法

如果servlet和过滤器链都不为空,则开始调用过滤器链的doFilter() 方法

ApplicationFilterChain.doFilter()->internalDoFilter()

pos:为过滤器链中当前执行的过滤器下标。 n:过滤器链中的过滤器个数。

每执行一个过滤器则把过滤器链中的post+1(下标),直到所有的过滤器的doFilter方法都调用成功。

filter.doFilter(request, response, this);

这行代码是责任链设计模式的核心,把当前的过滤链传入到doFilter方法中。 这样在Filter中进行拦截,通过过滤器判断是否要进行调用下一个过滤器链。

过滤器链中的所有过滤器的doFilter方法都执行完成后,最后再调用过滤器链中存放的servlet.service()方法。


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.08.31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Filter 概述
  • StandardWrapperValve.invoke()方法
  • ApplicationFilterFactory.createFilterChain() 方法
  • StandardWrapperValve.invoke()方法
  • ApplicationFilterChain.doFilter()->internalDoFilter()
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档