zoukankan      html  css  js  c++  java
  • 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代码中有不少抽象工具类,内部只有静态方法,为避免别人误用它来生成实例,将它设计为抽象类,这是设计者的意图。

  • 相关阅读:
    怎样装两个MySQL服务器
    MySQL 8.0.12的安装与卸载
    位运算符2
    位运算符
    赋值运算符
    love心形
    变量之间运算
    变量
    标识符
    算术运算符
  • 原文地址:https://www.cnblogs.com/doit8791/p/8026143.html
Copyright © 2011-2022 走看看