tomcat源码阅读之过滤器
一、Servlet过滤器:
1、介绍:
Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。
Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容;
在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。
过滤器的工作流程:
2、接口:

init(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml 文件中Servlet过滤器的初始化参数。
doFilter(ServletRequest, ServletResponse,FilterChain):这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器。
注意:在doFilter中一定要调用chain.doFilter()调用后续过滤器以及调用servlet.service,否则会导致其他过滤器和servlet.service方法得不到执行;
destroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源。
3、配置:
使用过滤器还需要进行在web应用的WEB-INF/web.xml文件中进行配置,一般需要配置filter和filter-mapping,当有多个过滤器串联时就需要多个这样的配置;示例如下:
<filter>
<filter-name>authority</filter-name>
<filter-class>com.util.AuthorityFilter</filter-class>
<init-param>
<param-name>blacklist</param-name>
<param-value>someone</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>authority</filter-name>
<url-pattern>/pages1/*</url-pattern>
</filter-mapping>
二、Tomcat实现源码分析:

1、FilterDef类示例代表了一个过滤器的配置定义,配置定义文件WEB-INF/web.xml中定义了过滤器的相关信息,webRuleSet.java中就有对这个配置进行解析的代码,如下:

2、ApplicationFilterConfig实现了FilterConfig接口,封装了一个FilterDef类的实例,在getFilter方法返回一个过滤器Filter的实例,根据FilterDef信息创建Filter实例;
3、ApplicationFilterChain实现了FilterChain接口,表示过滤器链,FilterChain接口只定义了doFilter一个方法,ApplicationFilterChain.doFilter方法中调用了internalDoFilter方法,internalDoFilter方法依次调用过滤器链中的所有过滤器的doFilter方法,调用完成后再调用servlet.service方法;

在过滤器的doFilter方法中要调用chain.doFilter方法调用链中的下一个过滤器,否则后面的过滤器均无法得到执行;

过滤器链执行完后再调用servlet.service方法执行servlet;
4、StandardWrapperValve.invoke方法中创建ApplicationFilterChain实例,并调用其doFilter方法完成对过滤器链的调用和servlet.service调用;在createFilterChain中首先创建ApplicationFilterChain实例,然后从context中查找与当前request路径相符或者servlet名称相符的过滤器,添加到这个ApplicationFilterChain实例中并返回,代码如下:


tomcat源码阅读之过滤器的更多相关文章
- SpringMVC源码阅读:过滤器
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- Tomcat源码阅读(二)初始化
近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...
- tomcat源码阅读
1 工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2 下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...
- tomcat源码阅读之SingleThreadModel
一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...
- tomcat源码阅读之载入器(Loader)
一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...
- tomcat源码阅读之BackupManager
一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...
- tomcat源码阅读之安全机制
一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...
- tomcat源码阅读之容器(Container)
一. 实现容器的接口是Container接口,Tomcat中共有四种类型的容器: 1.Engine:表示整个Catalina Servlet引擎: 2.Host:表示含有一个或者多个Context容器 ...
- tomcat源码阅读之集群
一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...
随机推荐
- IntelliJ Idea工具使用
以前一直用eclipse/myeclipse开发,最近因为需要学习了intelliJ Idea工具,感觉真的挺好用的..好用的东西就要掌握加以利用,特写一篇简单的总结(只写大体). 一,什么是Inte ...
- TitanX服务器登陆网关
- thinkphp查询缓存
S()函数的使用: ThinkPHP把各种缓存方式都抽象成统一的缓存类来调用,而且ThinkPHP把所有的缓存机制统一成一个S方法来进行操作,所以在使用 不同的缓存方式的时候并不需要关注具体的缓存 ...
- 原生JS和jQuery版实现文件上传功能
<!doctype html> <html lang="zh"> <head> <meta charset="utf-8&quo ...
- hibernate中删除表遇到主键被外键引用违反完整约束条件不能删除的问题
MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHECKS ...
- iOS UI-界面传值(三种方法)
#import <Foundation/Foundation.h> @interface DataModel : NSObject @property (nonatomic, copy) ...
- OC MRC之autorelease问题(代码分析)
// // main.m // 08-autorelease // // Created by apple on 13-8-9. // Copyright (c) 2013年 itcast. All ...
- Oracle12cr1新特性之容器数据库(CDB)和可插拔数据库(PDB) 的启动和关闭
Oracle12c中引入的多宿主选项(multitenant option)允许一个容器数据库容纳多个独立的可插拔数据库(PDB).本文将说明如何启动和关闭容器数据库(CDB)和可插拔数据库(PDB) ...
- 快照库MV不能成功刷新问题的解决
前几天,一个用户找到我,说他们的物化视图不能刷新了,这得从几天前主库的一次意外down机说起(另文说明),前几天,用户现场的一个中心库因某原因意外down掉了,当时短期内对中心库进行了重启修复,没有造 ...
- C语言、编程语言发展史
前言 了解和学习一门语言.一个系统乃至方方面面的任何东西时,如果不知道其历史和现状而只是一上来就一味地闷头苦学,你就很容易“一叶障目不见泰山”. 如此这般火急火燎的就上手苦干,私以为大错特错,所谓“学 ...
