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

配置分为两种A和B。

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

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

 在web.xml中增加如下内容:
<filter>
<filter-name>permission</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>permission</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping> 在spring bean配置中加入:
<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

Spring框架之Filter应用的更多相关文章

  1. Spring 框架的架包分析、功能作用、优点,及jar架包简介

    Spring 框架的架包详解    Spring的作用     Spring的优势  由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或 ...

  2. spring框架学习(六)AOP

    AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象. AOP的引入 在OOP面向对象的使用中,无可 ...

  3. 如何在spring框架中解决多数据源的问题

    在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库.我们以往在spring和hibernate框架中总是配置一个数据源,因而sessi ...

  4. 译:Spring框架参考文档之IoC容器(未完成)

    6. IoC容器 6.1 Spring IoC容器和bean介绍 这一章节介绍了Spring框架的控制反转(IoC)实现的原理.IoC也被称作依赖注入(DI).It is a process wher ...

  5. spring框架--IOC容器,依赖注入

    思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action  多个   [维护成员变量] service 一个   [不需要维护公共变量] dao     一个   [不需要维护 ...

  6. 《经久不衰的Spring框架:Spring+SpringMVC+MyBatis 整合》

    前言 主角即Spring.SpringMVC.MyBatis,即所谓的SSM框架,大家应该也都有所了解,概念性的东西就不写了,有万能的百度.之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目 ...

  7. 使用spring框架处理编码问题

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp90   我们在开发时,经常要对中文字符进行处理,进行处理中文字符的方式也 ...

  8. 细说shiro之五:在spring框架中集成shiro

    官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...

  9. Spring框架的第四天(整合ssh框架)

    ## Spring框架的第四天 ## ---------- **课程回顾:Spring框架第三天** 1. AOP注解方式 * 编写切面类(包含通知和切入点) * 开启自动代理 2. JDBC模板技术 ...

随机推荐

  1. 总结PHP删除字符串最后一个字符的三种方法

    一.前言 从数据库中select()读取一对多的信息时,经常需要将取出的数组用某个特定的字符分割,然后拼接成字符串. 常见的语法格式: foreach ($arr as $key => $val ...

  2. 怎么解决深入学习PHP的瓶颈?

    PHP给学习者的感觉是:初学的时候很容易,但是学了2-3年,就深刻感觉遇到了瓶颈,很难深入,放弃又可惜.所谓“鸡肋,食之无味弃之可惜”的感觉很是贴切. 经常会有这种感觉:不学,看似也不后退:学了,好像 ...

  3. 解决FileUpload上传大文件报错

    <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedConte ...

  4. $Yeasion$的码风修改历程

    总之,今天是一个值得纪念的伟大日子,我将自己的码风进行了彻底的修改,大概是参考了Pks和\(Rqy\)的码风,分为以下几点. 1.变量名.在所有的计算符号之前和之后加空格.如:"&& ...

  5. linux VMware使用

    contos7 配置网络 使用NAT模式连接本地网络 进入Linux机器配置网络 vi /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=EthernetP ...

  6. Unity 游戏框架搭建 (二十一) 使用对象池时的一些细节

    上篇文章使用SafeObjectPool实现了一个简单的Msg类.代码如下: class Msg : IPoolAble,IPoolType { #region IPoolAble 实现 public ...

  7. JAVA数据类型能串门不?

    JAVA这几种数据类型,能否串门?入了人家门,就得按人家规矩来,入乡随俗哦,难免发生有自觉的 还有不情愿被动的. 自动类型转换 自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型.在图中,黑 ...

  8. Cannot set HTTP gem source: “source https://rubygems.org not present in cache”

    My ruby version in Windows 10: > ruby -v ruby 2.3.1p112 (2016-04-26 revision 54768) [i386-mingw32 ...

  9. 【HDOJ 5726】GCD(RMQ+二分)

    Problem Description Give you a sequence of N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000). ...

  10. 在SQL Server中批量修改有规律列的定义

    )=N'要修改的表名'; --修改所有以sl结尾的列名的小数位数为4位 select syscolumns.name into #t1 from syscolumns,systypes where s ...