实战-JavaWweb的Servlet和Filter运行关系(二)

简介:

使用Servlet3.x对Filter类进行注解的时候,如何控制其执行顺序?


首先做个猜测,Filter作为类来组织的,并且使用注解(Annotation)标识。这时候问题来了,WEB容器是如何知道这些Filter的呢?注解标识?


翻看注解public @interface WebFilter:

wKiom1RUgxeg7d0NAADsytsNHGI530.jpg

       图b-1

查看了其属性,都具有默认值,也就是说不设置这些值,只需要通过@WebFilter标识后仍然可以作为一个Filter使用,那么也就证明了上面的猜测是不对了,因为这些属性的值没法作为排序的参考。

下面是摘自WebFilter注解的源代码:

1
String displayName()  default  "" ;
1
2
3
4
/**
      * @return name of the Filter, if present
      */
     String filterName()  default  "" ;
1
String  description() default  "" ;


 既然容器是通过注解WebFilter来发现Filter类,那么获得这些类之后如何进行执行顺序的安排则可以不需要依赖注解信息了。在(文一)中程序执行的结果和我们期待的结果达到一致,这恰恰是一个巧合。

EncodingFilter和RequestFilter这两个类的类名字典排序恰恰EncodingFilter在RequestFilter之前。


于是我们有了下面这个测试的案例:

wKiom1RUhSyj8L7NAACNGAPzrZg307.jpg

图b-2

wKioL1RUhYjSOdcTAACRHMwzQXM708.jpg

图b-3

改变类名,这个时候字典排序RncodingFilter在EequestFilter之后。

下面是运行的结果截图:

wKioL1RUhgLTYHs8AACauUMpiKY035.jpg

 图b-4

wKiom1RUhabBfHLaAAFDpwO4_ic547.jpg

图b-5


    看到上面的图说明这个猜测是正确了,此时先执行了RequestFilter后执行了EncodingFilter。同时我们可以讲图b-5和图a-2(文一)进行对比,浏览器中显示的内容有所不同,也就说明了Filter的执行顺序略微影响到输出内容。当然控制台的打印输出顺序更能说明问题。


    但是问题还并没有结束,看到上面用红色标注的内容“两个类的类名”,这两个类的类名应该是全名(即包名+类名)。而(文一)中的EncodingFilter和RequestFilter是处于同一个包的。为什么说是全名呢?自然是有依据的,出于同一个包的EncodingFilter和RequestFilter是没法完全证明“按照Filter类的类名字典顺序执行”这一说明。但是我们可以通过推断,一个包下不可能存在两个同名类,而不同包中可以存在同名类,如何仅仅是按照简单类名的话自然会发生同名Filter的冲突,此刻顺序就没法确定了,因而推断是按类的全名进行排序的。


    下面是类的包结构图:

   

wKiom1RUig2yn1uuAABhhQF0tAo478.jpg

图b-6

wKioL1RUimnSE5ilAAB9r3ArWBM990.jpg

图b-7

wKiom1RUig3gY7IGAACZZ_aewSk160.jpg

图b-8



   图b-6的包结构是(文一)中的案例采用的。通过实验了图b-7和图b-8的包结构,图b-8中的com.EncodingFilter实际是图b-6中的com.filter.RequestFilter。

   图b-7:

   字典排序:com.filter.EncodingFilter com.RequestFilter (忽略大小写排序)

  

wKiom1RUi4eRZPCCAAGa3LPZ3_0630.jpg

                  图b-9

   图b-8:

   字典排序:com.EncodingFilter com.filter.EncodingFilter(忽略大小写排序)

  

wKioL1RUi53yI7ztAAFTvK6Gw-c173.jpg

图b-10


   由于Servlet标准中没有给出这个可以设置参数,这样使得通过注解标识的Filter执行顺序变的复杂,本文仅通过实验来找出这其中的规律推测是按照类名的忽略大小写排序的。实验之中不免存在存问题,或许在使用中又能发现一些问题,当没法准确的判断时,使用web.xml配置可能更加安全一些。



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1570716,如需转载请自行联系原作者

目录
打赏
0
0
0
0
265
分享
相关文章
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
深入理解Servlet Filter及其限流实践
深入理解Servlet Filter及其限流实践
210 44
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
124 8
|
10月前
|
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
376 0
|
10月前
Servlet3.0+环境下使用注解注册Servlet、Filter和Listener组件
Servlet3.0+环境下使用注解注册Servlet、Filter和Listener组件
89 2
SpringBoot中注册Servlet、Filter和Listener(代码和注解两种方式)
SpringBoot中注册Servlet、Filter和Listener(代码和注解两种方式)
190 0
|
10月前
|
servlet/filter/listener/interceptor区别与联系
servlet/filter/listener/interceptor区别与联系
104 0
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)4
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)4
108 0
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)3
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)3
104 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等