Filter(过滤器)与Interceptor(拦截器)的区别

发布时间:2017-6-29 10:03:01编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Filter(过滤器)与Interceptor(拦截器)的区别",主要涉及到Filter(过滤器)与Interceptor(拦截器)的区别方面的内容,对于Filter(过滤器)与Interceptor(拦截器)的区别感兴趣的同学可以参考一下。

  1. 一、filter基于filter接口中的doFilter回调函数,interceptor则基于Java本身的反射机制;   
  2.   
  3. 二、filter是依赖于servlet容器的,没有servlet容器就无法回调doFilter方法,而interceptor与servlet无关;   
  4.   
  5. 三、filter的过滤范围比interceptor大,filter除了过滤请求外通过通配符可以保护页面、图片、文件等,而interceptor只能过滤请求,只对action起作用,在action之前开始,在action完成后结束(如被拦截,不执行action);   
  6.   
  7. 四、filter的过滤一般在加载的时候在init方法声明,而interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤;   
  8.   
  9. 五、interceptor可以访问action上下文、值栈里的对象,而filter不能;   
  10.   
  11. 六、在action的生命周期中,拦截器可以被多次调用,而过滤器只能在容器初始化时被调用一次。  
  12. -----------------------------------------------------------------------------------------------------------------------------------------------------  
  13. 四:interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤  
  14. interceptor在struts.xml配置举例:  
  15. <package name="XXX-default" namespace="/" extends="struts-default">  
  16.         <interceptors>  
  17.             <interceptor name="authentication" class="com.util.XXXInterceptor" />  
  18.               
  19.             <interceptor-stack name="user">  
  20.                 <interceptor-ref name="defaultStack" />  
  21.                 <interceptor-ref name="authentication" />  
  22.             </interceptor-stack>  
  23.             <interceptor-stack name="user-submit">  
  24.                 <interceptor-ref name="user" />  
  25.                 <interceptor-ref name="token" />  
  26.             </interceptor-stack>  
  27.             <interceptor-stack name="guest">  
  28.                 <interceptor-ref name="defaultStack" />  
  29.             </interceptor-stack>  
  30.             <interceptor-stack name="guest-submit">  
  31.                 <interceptor-ref name="defaultStack" />  
  32.                 <interceptor-ref name="token" />  
  33.             </interceptor-stack>  
  34.         </interceptors>  
  35.         <default-interceptor-ref name="user" />  
  36.    </package>  
  37. 五:interceptor可以访问action上下文、值栈里的对象  

===================================== Filter =========================================

    filter这个角色是用来:在请求到达servlet之前,先截获请求,对请求先做一些预处理(例如编码转换,权限验证)。处理完后在把请求转发给servlet或把不符合某些规则的请求丢弃掉,不再转发给servlet了。当servlet处理好请求后,返回响应给浏览器时,filter拦截响应,对响应做一些处理之后,再返回给浏览器。

    多个filter可以协同工作,它们之间采用了职责链的设计模式来协同工作。一个filter处理完后,调用下一个filter来处理,每个filter负责处理不同的工作,而这些filter之间可以根据需要灵活组合。filter的先后顺序按filter在web.xml中配置的先后顺序。

===================================== Interceptor =========================================
Interceptor是某些MVC框架中的角色,比如Struts2中,Interceptor是用来拦截Action中的方法的调用,在被拦截的Action方法被执行前,先执行响应的拦截器中的方法。interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现。


Java的反射机制主要功能: 
    (1)在运行时判断任意一个对象所属的类。 
    (2)在运行时构造任意一个类的对象。 
    (3)在运行时判断任意一个类所具有的成员变量和方法。 
    (4)在运行时调用任意一个对象的方法 
    前提是在运行时,不是编译时,也就是在运行前并不知道调用哪一个类,通过反射就可以做到这些 

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用


切入点的概念是AOP的关键,它使AOP区别于其他使用拦截的技术。

spring Web MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

常见应用场景 1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。 2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面; 3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录); 4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。 5、OpenSessionInView:如hibernate,在进入处理器打开Session,在完成后关闭Session。


上一篇:使用Python来编写HTTP服务器的超级指南
下一篇:第四十一篇:微信第三方登录

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款