过滤器,在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方法。