spring web中的filter

昨天看了会spring web中部分代码,主要是各种filter,回顾一下:

Spring的web包中中有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所当然地实现了javax.servlet.Filter,不过实现的方式有以下几类:

        (1) 直接实现Filter,这一类过滤器只有CompositeFilter;

        (2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;

        (3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;

        (4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter。

        本文要讲述的,即是GenericFilterBean、OncePerRequestFilter和AbstractRequestLoggingFilter。

        GenericFilterBean

        抽象类GenericFilterBean实现了javax.servlet.Filter、org.springframework.beans.factory.BeanNameAware、org.springframework.context.EnvironmentAware、org.springframework.web.context.ServletContextAware、org.springframework.beans.factory.InitializingBean和org.springframework.beans.factory.DisposableBean五个接口,作用如下:

        (1) Filter,实现过滤器;

        (2) BeanNameAware,实现该接口的setBeanName方法,便于Bean管理器生成Bean;

        (3) EnvironmentAware,实现该接口的setEnvironment方法,指明该Bean运行的环境;

        (4) ServletContextAware,实现该接口的setServletContextAware方法,指明上下文;

        (5) InitializingBean,实现该接口的afterPropertiesSet方法,指明设置属性生的操作;

        (6) DisposableBean,实现该接口的destroy方法,用于回收资源。

        GenericFilterBean的工作流程是:init-doFilter-destory,其中的init和destory在该类中实现,doFilter在具体实现类中实现。

   GenericFilterBean中包含一个内部私有类FilterConfigPropertyValues,主要用于将web.xml中定义的init-param的值取出。

        OncePerRequestFilter

        抽象类oncePerRequestFilter继承自GenericFilterBean,它保留了GenericFilterBean中的所有方法并对之进行了扩展,在oncePerRequestFilter中的主要方法是doFilter。

   AbstractRequestLoggingFilter

        AbstractRequestLoggingFilter继承了OncePerRequestFilter并实现了其doFilterInternal方法

我们在使用过滤器时,通常没必要知道GenericFilterBean、OncePerRequestFilter和AbstractRequestLoggingFilter,但不防碍我们了解这几个类,就上文所述,
AbstractRequestLoggingFilter继承自OncePerRequestFilter,
OncePerRequestFilter继承自GenericFilterBean,
所以我们知道,genericFilterBean是任何类型的过滤器的一个比较方便的超类,
这个类主要实现的就是从web.xml文件中取得init-param中设定的值,然后对Filter进行初始化(当然,其子类可以覆盖init方法)。

OncePerRequestFilter继承自GenericFilterBean,那么它自然知道怎么去获取配置文件中的属性及其值,所以其重点不在于取值,而在于确保在接收到一个request后,每个filter只执行一次,它的子类只需要关注Filter的具体实现即doFilterInternal。

AbstractRequestLoggingFilter是对OncePerRequestFilter的扩展,它除了遗传了其父类及祖先类的所有功能外,还在doFilterInternal中决定了在过滤之前和之后执行的事件,它的子类关注的是beforeRequest和afterRequest。

总体来说,这三个类分别执行了Filter的某部分功能,当然,具体如何执行由它们的子类规定,若你需要实现自己的过滤器,也可以根据上文所述继承你所需要的类。

 

另外Spring代码中有不少抽象工具类,内部只有静态方法,为避免别人误用它来生成实例,将它设计为抽象类,这是设计者的意图。

posted on 2017-12-12 08:33  时间朋友  阅读(3305)  评论(0编辑  收藏  举报

导航