过滤器与拦截器的具体区别
2015-12-18 10:28
295 查看
Filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。
Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。
Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤。
简单的总结理解:
1:Filter 对在web.xml中该filter配置的路径进行单向拦截, request匹配Filter的路径时做一次拦截! 这个底层实现没想过, 嘿嘿!
2:interceptor的拦截处理其实就是代理机制!
Struts2官方文档那个图画的相当明了了。既然是代理,那么是双向拦截,拦截器在action的方法之前执行一次, 之后执行一次!
根据那个图,你可以再对应的去看下StrutsPrepareAndExecuteFilter的源代码,前面一段代码产生Action的环境,判断mapping之类的, 可以跟进ExecuteOperations execute这个成员变量,下面如果前面一系列判断都满足的话, 会调用execute.executeAction, 这个里面的实现就是产生action的代理, 然后通过配置信息, 去获得这个action身上配置了哪些拦截器,然后执行拦截器的代码,拦截器中用ActionInvocation去通知下一个拦截器执行, 等到所有的拦截器都拦完了以后,执行action, 随后拦截器又会反向执行一遍(官方确实是这个意思, LZ可以自己写两个拦截器测试下看是不是这么会是)
所以对于Interceptor是不对request进行处理的, 它只是对action起作用。Struts的那个核心过滤器拦截了action的请求之后产生action的代理后进行处理的!
Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。
Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤。
简单的总结理解:
1:Filter 对在web.xml中该filter配置的路径进行单向拦截, request匹配Filter的路径时做一次拦截! 这个底层实现没想过, 嘿嘿!
2:interceptor的拦截处理其实就是代理机制!
Struts2官方文档那个图画的相当明了了。既然是代理,那么是双向拦截,拦截器在action的方法之前执行一次, 之后执行一次!
根据那个图,你可以再对应的去看下StrutsPrepareAndExecuteFilter的源代码,前面一段代码产生Action的环境,判断mapping之类的, 可以跟进ExecuteOperations execute这个成员变量,下面如果前面一系列判断都满足的话, 会调用execute.executeAction, 这个里面的实现就是产生action的代理, 然后通过配置信息, 去获得这个action身上配置了哪些拦截器,然后执行拦截器的代码,拦截器中用ActionInvocation去通知下一个拦截器执行, 等到所有的拦截器都拦完了以后,执行action, 随后拦截器又会反向执行一遍(官方确实是这个意思, LZ可以自己写两个拦截器测试下看是不是这么会是)
所以对于Interceptor是不对request进行处理的, 它只是对action起作用。Struts的那个核心过滤器拦截了action的请求之后产生action的代理后进行处理的!
相关文章推荐
- ubuntu挂载\卸载U盘的方法
- Android Studio开发安卓插件
- win7开机进系统黑屏,只有鼠标解决方法
- Binary Tree Postorder Traversal
- TypeScript笔记[5]泛型+Dictionary 转
- 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】
- 从10w条记录随机取出n条记录高效率解决方案
- Android慎用layout嵌套, 尽量控制在5层以下java.lang.StackOverflowError
- 如何准确的向工程师传达动效设计?
- Ext.js5的列冻结(5)
- html修炼养成--怎样使用Swiper
- solrcloud搭建
- eclipse安装svn插件
- js中的坑
- 构建基于Jenkins+maven+git+tomcat7的持续集成环境
- 蓝牙HID协议介绍
- 第六章TCP和UDP基本原理(续)
- 【跟着大磨马学IT编程(安卓java程序员)】第十八天 课程内容概述
- python学习记录(2)高级特性
- VS2013 VC++ 编译遇到不支持非unicode字符集的错误