Java面试题之《过滤器与拦截器的区别》

过滤器与拦截器的区别java

过滤器,是在java web中,你传入的request,response提早过滤掉一些信息,或者提早设置一些参数,而后再传入servlet或者struts的 action进行业务逻辑,好比过滤掉非法url(不是login.do的地址请求,若是用户没有登录都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符web

拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法好比动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者作其它业务逻辑的操做),也能够在你调用方法后打印出字符串,甚至在你抛出异常的时候作业务逻辑的操做。spring

 

拦截器与过滤器的区别 :apache

  1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  3. 拦截器只能对action请求起做用,而过滤器则能够对几乎全部的请求起做用。
  4. 拦截器能够访问action上下文、值栈里的对象,而过滤器不能访问。
  5. 在action的生命周期中,拦截器能够屡次被调用,而过滤器只能在容器初始化时被调用一次
  6. 拦截器能够获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,能够调用业务逻辑。

 

执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。我的认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登陆用户不能访问内部页面的处理);过滤经过后,拦截器将检查用户提交数据的验证,作一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还能够作其余过程(还没想到要作啥),再向上返回到过滤器的后续操做。编程

 

拦截器与过滤器使用场景:cookie

SpringMVC的处理器拦截器相似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。函数

一、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。性能

二、权限检查:如登陆检测,进入处理器检测检测是否登陆,若是没有直接返回到登陆页面;url

三、性能监控:有时候系统在某段时间莫名其妙的慢,能够经过拦截器在进入处理器以前记录开始时间,在处理完后记录结束时间,从而获得该请求的处理时间(若是有反向代理,如apache能够自动记录);spa

四、通用行为:读取cookie获得用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都须要的便可使用拦截器实现。

五、OpenSessionInView:如hibernate,在进入处理器打开Session,在完成后关闭Session。

拦截器是AOP的一种实现,底层经过动态代理模式完成。

 

总结:

1.过滤器:所谓过滤器顾名思义是用来过滤的,在Java web中,你传入的request,response提早过滤掉一些信息,或者提早设置一些参数,而后再传入servlet或者struts的action进行业务逻辑,好比过滤掉非法url(不是login.do的地址请求,若是用户没有登录都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室常常用到的,一些骂人的话)。filter 流程是线性的, url传来以后,检查以后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等.

2.java的拦截器 主要是用在插件上,扩展件上好比 hivernate spring struts2等 有点相似面向切片的技术,在用以前先要在配置文件即xml文件里声明一段的那个东西。

相关文章
相关标签/搜索