一、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源码阅读之过滤器的更多相关文章

  1. SpringMVC源码阅读:过滤器

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  2. Tomcat源码阅读(二)初始化

    近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...

  3. tomcat源码阅读

    1      工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2      下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...

  4. tomcat源码阅读之SingleThreadModel

    一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...

  5. tomcat源码阅读之载入器(Loader)

    一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...

  6. tomcat源码阅读之BackupManager

    一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...

  7. tomcat源码阅读之安全机制

    一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...

  8. tomcat源码阅读之容器(Container)

    一. 实现容器的接口是Container接口,Tomcat中共有四种类型的容器: 1.Engine:表示整个Catalina Servlet引擎: 2.Host:表示含有一个或者多个Context容器 ...

  9. tomcat源码阅读之集群

    一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...

随机推荐

  1. python-day37--协程

    一. 协程介绍 单线程下实现并发,提升运行效率, 1.自己控制切换,保存状态 2.遇到I/O切         (单纯的CPU切没意义,只有在遇到I/O的时候切才有效率) 一句话说明什么是线程:协程是 ...

  2. CoderForce 140C-New Year Snowmen(贪心)

    题目大意:有n个已知半径的雪球.堆一个雪人需要三个尺寸不同的雪球,问用这些雪球最多能堆多少个雪人? 题目分析:先统计一下每种尺寸的球的个数,从三种最多的种类中各取出一个堆成雪人,这样贪心能保证的到的数 ...

  3. UVA-10710 Skyscraper Floors (找规律+幂取模)

    题目大意:题目中给了一种数的定义,根据定义,让判断一个给定的数是不是这种数.题中叫这种数为吉米数,定义如下:对序列1,2,3,,,,n,做n-1次SF变换(对该变换的解释在下文),如果能得到原序列,则 ...

  4. SQL语句增加列、修改列类型、修改列、删除列

    1.增加列: alter table tableName add columnName varchar(30) 2.修改列类型: alter table tableName alter column ...

  5. 使用Bulk Binding批量绑定的模式高效处理ORACLE大量数据

           用批量绑定(bulk binding)的方式.当循环执行一个绑定变量的sql语句时候,在PL/SQL 和SQL引擎(engines)中,会发生大量的上下文切换(context switc ...

  6. 使用python,将excel数据批量导入数据库

    这是上一篇文章的优化版本,相较于一条一条的执行sql语句,本文中,将excel中所有的数据先写到list列表中 在通过函数 cursor.executemany(sql, list) 一次性写入到数据 ...

  7. 非常简单的vue里面引入jquery

    如何在vue里面引入jq了,只需四部就完成 第一步 cnpm install jquery 第二步 打开build文件夹 , 打开webpack.base.conf.js文件找到下面module.ex ...

  8. FE英文缩写

    PM:product manager,产品经理,又称品牌经理,brand managerRD:research and development enginner,研发工程师FE:front-end d ...

  9. Java——多线程面试问题

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  10. Python 文件修改

    # 需求: 把好人换成sb # 必须: # 1. 先从文件中读取内容 # 2. 把要修改的内容进行修改 # 3. 把修改好的内容写人一个新文件 # 4. 删除掉原来的文件 # 5. 把新文件重命名成原 ...