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 ...
随机推荐
- python-day18--匿名函数
一.lambda表达式 1.匿名函数的核心:一些简单的需要用函数去解决的问题,匿名函数的函数体只有一行 2.参数可以有多个,用逗号隔开 3.返回值和正常的函数一样可以是任意的数据类型 4.练习: 请把 ...
- 3n+1问题中的几个小的注意点
3038 3n+1问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 3n+1问题是一个简单有趣而又没有 ...
- store procedure
store procedure: _________________________________________________ set ANSI_NULLS ON set QUOTED_IDEN ...
- 操作系统错误 5:"5(拒绝访问。)
------------------------------ 无法打开物理文件 "G:/QGJX.mdf".操作系统错误 5:"5(拒绝访问.)". (Micr ...
- ASP.NET简介
1.什么是ASP.NET? ASP.NET是一套免费的网络架构,是为了构建一个伟大的或者说非常不错的网站或网络应用,并同时使用了一些前端技术,比如说HTML,CSS和JavaScript ASP.NE ...
- linux磁盘清理记录
执行df -h查看自己的数据磁盘到达97% 使用du -h --max-depth=1 查看数据占用较大的文件 清理记录 1.mysql慢查询日志 # mv slow.log slow.log.ba ...
- 快速切题sgu126. Boxes
126. Boxes time limit per test: 0.25 sec. memory limit per test: 4096 KB There are two boxes. There ...
- Linux内核分析-分析Linux内核创建一个新进程的过程
作者:江军 ID:fuchen1994 实验题目:分析Linux内核创建一个新进程的过程 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/li ...
- 【python爬虫】常见面试题之http协议问题总结
简介 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减 ...
- UIWebView和UIWebViewDelegate的基本用法 (转)
一.UIWebView主要有三种方法实现页面的装载,分别是: 1. (void)loadRequest:(NSURLRequest *)request; (直接装载URL) 2. (void)loa ...