Filter过滤器机制
tomcat内部过滤器采用了责任链的设计模式,
Tomcat的过滤器主要由Filter、FilterChain组成,FilterChain包含一个Filter数组.当Wrapper执行FilterChain的doFilter(request,response)方法时,FilterChain首先调用第一个Filter的doFilter(request,response,filterchain)方法,当第一个filter做完过滤操作后,它又会调用filterchain的doFilter方法,此时filterchain的当前filter已变为第二个filter,第二个filter又执行dofilter方法,依此类推,直至所有过滤器都执行完毕。
- public interface Filter {
- .....
- //执行过滤
- public void doFilter ( ServletRequest request, ServletResponse response, throws IOException, ServletException;
- }
- public interface FilterChain {
- public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
- }
FilterConfig接口检索过滤器名、初始化参数以及活动的Servlet上下文。ApplicationFilterConfig是其实现类
ApplicationFilterChain在catalina.jar的org.apache.catalina.core包中
- class ApplicationFilterChain implements FilterChain {
- ..................
- private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0];
- private int pos = 0;
private int n = 0; - //pos为当前filter的所在位置,n为filters数组的长度
- if (pos < n) {
- //pos++执行后,把filterchain的当前filter指向下一个
- ApplicationFilterConfig filterConfig = filters[pos++];
- Filter filter = null;
- try {
- filter = filterConfig.getFilter();
- //filter执行过滤操作
- filter.doFilter(request, response, this);
- }
- ...
- }
- }
实例如下:
- class SampleFilter implements Filter {
- ........
- public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
- throws IOException, ServletException {
- //do something
- .....
- //request, response传递给下一个过滤器进行过滤
- chain.doFilter(request, response);
- }
- }
先描述tomcat的方法调用序列。
具体过程如下:
(1)connector 创建 request 和 response 对象;
(2)connector 调用 StandardContext 实例的 invoke 方法;
(3)StandardContext 接着调用其 pipeline 的 invoke 方法,StandardContext 中 pipeline 的 basic valve 是
StandardContextValve,因此,StandardContext 的 pipeline 会调用 StandardContextValve 的 invoke 方法;
(4)StandardContextValve 的 invoke 方法获取 wrapper 处理请求,调用 wrapper 的 invoke 方法;
(5)StandardWrapper 是 Wrapper 接口的标准实现,StandardWrapper 实例的 invoke 方法会调用其
pipeline 的 invoke 方法;
(6)StandardWrapper 的 pipeline 中的 basic valve 是 StandardWrapperValve,因此,会调用其 invoke 方
法,StandardWrapperValve 调用 wrapper 的 allocate 方法获取 servlet 实例;
(7)allocate 方法调用 load 方法载入 servlet 类,若已经载入,则无需重复载入;
(8)load 方法调用 servlet 的 init 方法;
(9)StandardWrapperValve 调用 servlet 的 service 方法。
StandardWrapperValve中的主要代码如下:
- ApplicationFilterChain filterChain =
- createFilterChain(request, servlet);
- /*略
- String jspFile = wrapper.getJspFile();
- if (jspFile != null)
- sreq.setAttribute(Globals.JSP_FILE_ATTR, jspFile);
- else
- sreq.removeAttribute(Globals.JSP_FILE_ATTR);
- if ((servlet != null) && (filterChain != null)) {
- filterChain.doFilter(sreq, sres);
- }
- sreq.removeAttribute(Globals.JSP_FILE_ATTR);
在StandardWrapperValve的invoke中(也就是上面贴的代码),第10行的代码就是调用servlet的入口,传说中的doFilter()。
Filter过滤器机制的更多相关文章
- filter 过滤器(监听)
Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...
- Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- javaweb学习总结(四十二)——Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- javaWeb学习总结(10)- Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 web资源:例如Jsp, Servlet, 静 ...
- JavaWeb(五)Filter过滤器
Filter过滤器 Fileter介绍 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Serv ...
- 简易RPC框架-过滤器机制
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- javaweb之Filter过滤器详解
快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能 ...
- Filter(过滤器)
一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方 ...
- JavaWeb学习篇--Filter过滤器
Filter过滤器简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的 java 类实现了这个接口,则把这个java类称之为过滤器Filter. WEB服务器每次在调用 ...
随机推荐
- GIt学习之路 第二天 创建版本库
本文参考廖雪峰老师的博客进行总结,完整学习请转廖雪峰博客 创建版本库 阅读: 1859216 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文 ...
- RHEL5.6环境下yum安装MySQL
RHEL5.6环境下yum安装MySQL记录,2017年2月20日 1.卸载原有的MySQL rpm -qa命令查询是否安装了MySQL [root@localhost mysql]# rpm -qa ...
- Android 性能优化(18)JNI优化:JNI Tips 提升性能技巧
JNI Tips 1.In this document JavaVM and JNIEnv Threads jclass, jmethodID, and jfieldID Local and Glob ...
- Android内存管理(14)*使用开源库LeakCanary检查内存泄漏
1.简介 它是一个非常简单好用的内存泄漏检测工具库.可以轻松检测Activity,Fragment的内存泄漏.如果有内存泄漏,它会产生一个通知. 2.资料 官网: https://github.com ...
- Linux 介绍快速浏览
Linux 介绍 内核 库: .so 共享对象,windows:dll 动态链接库 应用程序 Linux的基本原则:1.由目的单一的小程序组成:组合小程序完成复杂任务:2.一切皆文件:3.尽量避免捕获 ...
- 窗体基础WINFORM
winform 1.窗体: 造窗体界面: 窗体设计界面: 窗体类名不能重复! 属性: acceptbutton:回车是默认点击按钮 cancelbutton:按esc按键式默认的按钮 backcolo ...
- Winform学习知识汇总
引用博客 http://www.cnblogs.com/peterzb/archive/2009/06/14/1502918.html
- Appium环境部署
Appium 是一个开源.跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android平台. 需要部署的软件:python环境.nodejs..net framework4.5. ...
- [Windows Server 2012] 更换PHP版本方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:更换PHP ...
- (转)Hibernate框架基础——一对多关联关系映射
http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即 ...