zoukankan      html  css  js  c++  java
  • Spring框架之Filter应用

    在web.xml中进行配置,对所有的URL请求进行过滤,就像"击鼓传花"一样,链式处理。

    配置分为两种A和B。

     1 在web.xml中增加如下内容:
     2 <filter>
     3     <filter-name>permissionFilter</filter-name>
     4     <filter-class>com.taobao.riskm.filter.PermissionFilter</filter-class>
     5 </filter>
     6 <filter-mapping>
     7     <filter-name>permissionFilter</filter-name>
     8     <url-pattern>/*</url-pattern>
     9 </filter-mapping>
    10 由filter和filter-mapping构成。filter指定过滤器处理类(实现了Filter接口),filter-mapping指定过滤的规则。

    B:高级配置(允许代理注入Spring bean)

     1 在web.xml中增加如下内容:
     2 <filter>
     3     <filter-name>permission</filter-name>
     4     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
     5     <init-param>
     6         <param-name>targetFilterLifecycle</param-name>
     7         <param-value>true</param-value>
     8     </init-param>
     9 </filter>
    10  <filter-mapping>
    11     <filter-name>permission</filter-name>
    12     <url-pattern>*.htm</url-pattern>
    13 </filter-mapping>
    14 
    15 在spring bean配置中加入:
    16  <bean id="permission" class="com.taobao.kfc.kwb.web.permission.PermissionHttpServlet"></bean>

    因为filter比bean先加载,也就是spring会先加载filter指定的类到container中,这样filter中注入的spring bean就为null了。

    解决办法:
    先filter中加入DelegatingFilterProxy类,"targetFilterLifecycle"指明作用于filter的所有生命周期。
    原理是,DelegatingFilterProxy类是一个代理类,所有的请求都会首先发到这个filter代理,然后再按照"filter-name"委派到spring中的这个bean。

    在Spring中配置的bean的name要和web.xml中的<filter-name>一样.

    此外,spring bean实现了Filter接口,但默认情况下,是由spring容器来管理其生命周期的(不是由tomcat这种服务器容器来管理)。如果设置"targetFilterLifecycle"为True,则spring来管理Filter.init()和Filter.destroy();若为false,则这两个方法失效!!

    B和A最大的不同是,A是一个filter,优先被加载到container中,无法调用spring中后续的bean;而B是一个spring bean,可以引用其他的bean,而请求都通过DelegatingFilterProxy类委派给B!

    B的另外一种配置方式:

    <filter>
        <filter-name>permission</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetBeanName</param-name>
            <param-value>Spring-bean-name</param-value>
        </init-param>
    </filter>

    也就是增加一个"targetBeanName"的参数,值为实际执行Filter的bean。

    注意:Filter和servlet都可以对URL进行处理,Filter是一个链式处理,只要你想继续处理就可以传递下去;而Servlet则是一次处理并返回!适合简单逻辑处理。

    附录:
    <url-pattern>可以选择以下几种形式

    /*  所有资源
    *.html  以html结尾的资源
    /fold/* 指定目录
    /abc.html   指定文件
    以”/’开头和以”/*”结尾的是用来做路径映射的,
    以前缀”*.”开头的是用来做扩展映射的。

    为什么定义”/*.action”这样一个看起来很正常的匹配会错?
    因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

    此外,filter就像"递归",在web.xml配置中的顺序代表了filter的调用流程,而servlet被调用后不会继续调用其他的servlet!因此配置中的顺序不影响!

    小结:工作之后才知道,每天可以积累的东西很多,但的确没多少时间写出来!理解一个东西需要花点时间,但写出来就需要花更多的时间……写出来的好处就不用多说了,希望以后多挤一些时间,好好沉淀下。

    (全文完)

    感谢原博主    原文路径: http://blog.csdn.net/whuslei/article/details/8134848

  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/feiyuanxing/p/4576994.html
Copyright © 2011-2022 走看看