过滤器,在Web中称之为Filter,通过配置多个过滤器,Web系统可以对所有的Servlet请求进行一层一层的过滤,以完成一些特殊的功能。例如常用的资源访问权限控制、特殊字符以及敏感词过滤、响应信息压缩等功能。

如何在我们的Web系统中添加过滤器?

第一步:定义一个类,并继承javax.servlet.Filter接口


       注意:init方法在Web容器启动时就会执行,doFilter在每个Servlet请求的时候执行。

第二步:在web.xml中添加过滤器的配置信息

完成以上两步,你的Web系统就可以拥有自己的过滤器了。


过滤器API详解

在Servlet规范中,有 3个关于过滤器的核心接口,他们分别是Filter、FilterConfig和FilterChain,他们的定义关系如下图:


过滤器API类图

Filter:过滤器接口

       Web系统实现此接口,并配置到web.xml中,满足条件的所有Servlet请求就都将经过此过滤器。

       Web程序可以在下一个过滤器的执行的前后分别实现自己的逻辑,代码如下图:

FilterConfig:过滤器配置接口

       该接口实现类的对象中存储了有关Filter的一些配置信息,其中包括了过滤器名称、初始化的参数,并且关联了Servlet的上下文,过滤器可以根据此对象进行初始化。

FilterChain:过滤器链

       该接口只提供了一个doFilter方法,通过该方法,当前过滤器可以找到下一个过滤器,并执行其doFIlter方法,也就是说,FilterChain对象中设计了一套过滤器存储链,用来设定过滤器的执行顺序。

Tomcat中FilterChain的实现类为ApplicationFilterChain,我们将通过此类的两个代码片段来分析tomcat是如何实现FilterChain的。

     

       ApplicationFilterChain中并没有直接存放过滤器引用,而是存放了一组ApplicationFilterConfig(此类实现了FilterConfig接口,并新增了getFilter方法)对象。并且定义了两个int类型的属性,其中pos指向当前正在执行的ApplicationFilterConfig对象的下标,n为系统定义的过滤器的数量。

       当Filter执行chain.doFilter时,tomcat将pos指向下一个filterConfig对象,并获取对应的过滤器执行其doFilter方法。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐