在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

未来星开发团队--狒狒 QQ:9715234

Spring框架之Filter应用相关推荐

  1. Spring MVC 第四章:Form表单验证-JSR303和Spring框架验证以及国际化语言、Filter过滤器

    Form表单的验证验证,就是在提交表单的时候进行验证是否为空,是否满足特定条件才可以创建.常见的表单有前端验证和后端验证. 其中,前端验证有:HTML验证,JS验证,Jquery验证. 后端验证有:J ...

  2. 实现基于Spring框架应用的权限控制系统(转)

    为什么80%的码农都做不了架构师?>>>    前注:当我摸到了通过filter拦截权限,通过AOP拦截方法,通过权限控制菜单的时候,猛然发现这一切的一切已经是别人已经发明好的轮子. ...

  3. 【Spring框架家族】Spring--Security权限控制密码加密

    Spring Security简介 Spring Security是 Spring提供的安全认证服务的框架. 使用Spring Security可以帮助我们来简化认证 和授权的过程.官网:https: ...

  4. (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)

    Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1)  IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...

  5. spring框架所有包解释

    2019独角兽企业重金招聘Python工程师标准>>> spring依赖的jar包如下: 下面是每个jar包的说明 spring.jar 是包含有完整发布模块的单个jar 包.但是不 ...

  6. Spring在Java Filter注入Bean为Null的问题解决

    From: https://www.cnblogs.com/EasonJim/p/7666009.html 在Spring的自动注入中普通的POJO类都可以使用@Autowired进行自动注入,但是除 ...

  7. Spring 框架基础(01):核心组件总结,基础环境搭建

    本文源码:GitHub·点这里 || GitEE·点这里 一.Spring框架 1.框架简介 Spring是一个开源框架,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 ...

  8. java集成hibernate_JavaWeb_(Spring框架)Spring整合Hibernate

    Dao层类要继承HibernateDaoSupport.java父类 原先使用Hibernate框架hibernate.cfg.xml配置数据库 com.mysql.jdbc.Driver jdbc: ...

  9. JAVA开发血泪之路:一步步搭建spring框架

    JAVA开发血泪之路:一步步搭建spring框架 作为一个服务端开发感觉一直挺排斥框架这种东西的,总觉得什么实现逻辑都帮你封装在里面了,你只需要配置这配置那个,出了问题也不知道怎么排查,之前即使写we ...

最新文章

  1. response设置编码的三种方式
  2. sdut 2134 数据结构实验之栈与队列四:括号匹配
  3. 研究生调剂!!急!!!跪求解答!!?
  4. tomcat限制用域名访问 禁止 ip访问
  5. php获取数据库的表名和字段名
  6. 团队管理中的每日站立会
  7. 两种自定义表单设计方案 [转贴]
  8. 第七章部分例题最大乘积
  9. QThread使用方法
  10. 1146 Topological Order(25 分)
  11. JAVA 仿QQ聊天程序
  12. 微信小程序开发中遇到的坑
  13. input获取焦点vue_在Vue中输入框自动获取焦点的三种方式
  14. python SSLError HTTPSConnectionPool bad handshake
  15. pyalgotrade源码分析4--PyAlgoTrade统计指标
  16. 【老鸟进阶】deepfacelab训练参数详解
  17. 百度AI 开放平台 语音合成
  18. 小学生关于计算机的知识,计算机是什么,给小学生讲计算机知识.ppt
  19. 2018/3/6-2018/3/10
  20. [转]告别写计划的烦恼!一页纸四步打造出一份牛逼的商业计划

热门文章

  1. RMAN备份与恢复(三)--备份相关概念
  2. bzoj 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
  3. G面经prepare: Straight Partition of A Deck of Cards
  4. Mybatis出现文档根元素 mapper 必须匹配 DOCTYPE 根 configuration错误解决办法
  5. 使用com.alibaba.fastjson.JSONObject构造简单的JSON数据
  6. JDK11+Tomcat10 下载安装+环境配置
  7. 计算机应用基础第二版在线作业一,计算机应用基础在线作业一
  8. python io_Python 的 io.StringIO()
  9. JAVA中String类以形参传递到函数里面,修改后外面引用不能获取到更改后的值
  10. FASTQ format