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

一、filter基于filter接口中的doFilter回调函数,interceptor则基于Java本身的反射机制; 

二、filter是依赖于servlet容器的,没有servlet容器就无法回调doFilter方法,而interceptor与servlet无关; 

三、filter的过滤范围比interceptor大,filter除了过滤请求外通过通配符可以保护页面、图片、文件等,而interceptor只能过滤请求,只对action起作用,在action之前开始,在action完成后结束(如被拦截,不执行action); 

四、filter的过滤一般在加载的时候在init方法声明,而interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤; 

五、interceptor可以访问action上下文、值栈里的对象,而filter不能; 

六、在action的生命周期中,拦截器可以被多次调用,而过滤器只能在容器初始化时被调用一次。
-----------------------------------------------------------------------------------------------------------------------------------------------------
四:interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤
interceptor在struts.xml配置举例:
<package name="XXX-default" namespace="/" extends="struts-default">
        <interceptors>
            <interceptor name="authentication" class="com.util.XXXInterceptor" />
            
            <interceptor-stack name="user">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="authentication" />
            </interceptor-stack>
            <interceptor-stack name="user-submit">
                <interceptor-ref name="user" />
                <interceptor-ref name="token" />
            </interceptor-stack>
            <interceptor-stack name="guest">
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
            <interceptor-stack name="guest-submit">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="token" />
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="user" />
   </package>
五: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。


  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值