今天忽然心血来潮,想知道具体的servlet filter的顺序..于是测试:
测试环境:apache-tomcat-6.0.16
加载顺序init顺序:
filter-->servlet
处理请求顺序:
filter-->servlet-->filter
销毁顺序:
servlet-->filter
在这里粘贴前辈发表过的文章,web.xml的mapping处理
http://foxty.iteye.com/blog/39332
引用
一,servlet容器对url的匹配过程:
当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:
1. 精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。
2. 最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
3. 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action
4. 如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。
根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。
对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。
二,url-pattern详解
在web.xml文件中,以下语法用于定义映射:
l 以”/’开头和以”/*”结尾的是用来做路径映射的。
l 以前缀”*.”开头的是用来做扩展映射的。
l “/” 是用来定义default servlet映射的。
l 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。
分享到:
相关推荐
Servlet Filter 的单元测试Servlet Filter 的单元测试Servlet Filter 的单元测试Servlet Filter 的单元测试Servlet Filter 的单元测试
web.xml 中的listener、 filter、servlet 加载顺序及其详解
web.xmllistener、filter、servlet加载顺序.pdf
详细的解释了servlet filter listener 额知识,本文档适合初学者阅读
JSP Servlet基础知识测试题
关于filter、servlet在web.xml配置及加载顺序
java servlet spring web filter listenr
简单的servlet+Filter的例子,简单的结合这两个的例子。
Spring 管理filter 和servlet
本源码将详细介绍web.xml配置中servlet,filter,listener的加载顺序,可以让学习者更好的了解web.xml各种属性配置,自己写的东西,不足之处请大家见谅,顺便收点积分也好下资料,谢谢
servlet之Filter使用范例--登陆验证,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45480101
模仿servlet 的filter写的,拦截器涉及模式的具体实现
在com.tacitknowledge.filters开源项目上的扩展,修改了原项目的部分代码,其中配置文件名字应该在classes目录下filters_config.properties.其他的可以参照apidocs,如有bug可给我留言或者email:zhuyu4839@gmail.com
Servlet3 学习测试代码
重写了servlet能实现乱码过滤,并能屏蔽敏感字符!
Servlet之Filter深入讲解及实例研究 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45480101
JSP 演示代码 技术:JSP Servlet JavaBean Filter 实现:过滤器实现权限登录功能。
编写 Servlet 并添加两个 Filter,并确保在 Servlet 执行之前和之后执行这些 Filter。 以下是实现此目的的步骤: 首先,创建一个 Java Web 项目并添加必要的库和依赖项,以便可以编写 Servlet 和 Filter。 创建一个...
javax.servlet的jar包,解决找不到javax.servlet.*等问题的!欢迎下载!!
jsp+servlet的阶段范围测试题目,重点在于上级题目,完成单表增删查该,为框架学习做好技术准备。