您的位置:首页 > 编程语言 > Java开发

过滤器和拦截器之间的关系和区别

2016-12-14 14:56 232 查看
1.过滤器和拦截器的区别

   1)原理不同:拦截器是基于java的反射机制,而过滤器是基于函数回调

   2)作用对象不同:拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

   3)调用次数不同:在action的生命周期,拦截器可以多次被调用,而过滤器只能在容器初始化

       时被调用一次

   4) 拦截器不依赖于servlet容器,过滤器依赖于servlet容器

   5) 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问

   6)拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个

      service,可以调用业务逻辑。

2.描述

   过滤器是javaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入servlet之

前进行预处理,并且在请求结束返回个前端这之间进行后期处理。

   拦截器是被包裹在 过滤器之中的。

总结:拦截器主要在请求权限鉴定方面有很大用处。

3.过滤器的概念

--过滤器在请求与响应的哪个阶段发挥作用

--多个过滤器的使用

  3.1 什么样的需求让过滤器出现?

    1)针对所有的servlet,产品经理想要了解从请求到响应之间的时间差

    2)针对某些特定给的页面,客户希望只有特定几个用户才可以浏览

    3)基于安全方面的考虑,用户输入的特定字符必须过滤并替换为无害的字符

    4)请求与响应的编码从Big5改用UTF-8

    3.1.1 分析这些需求:
运行servlet的service前,记录起始时间,servlet的service的方法运行后,记录结束时间并计算时间差
运行servlet的service前,验证是否为允许的用户

    运行servlet的service前,对请求参数尽心字符过滤与替换
运行servlet的service前,对请求和响应对象设置编码格式

    总结:经过分析,发现这些需求,可以在真正运行servlet的service方法前与servlet的service
 方法后中间进行实现。

    3.1.2 这些需求有哪些?
1)5)性能评测(开发阶段才需要,上线后去掉):例如计算时间差
2)用户验证
3)字符替换

  4)编码转换
5)压缩--->响应

       这类的需求应该设计为独立的元件,随时可以加入到应用程序当中,也随时可以移除,或随时

    可以修改设置而不用修改原有的程序。

---->servlet/jsp提供过滤器机制让你实现这些元件服务

    3.1.3 灵活的使用规则
1)可以根据需求替换过滤器或调整过滤器的顺序
2)也可以针对不同的url使用不同的过滤器

  3)甚至在不同的servlet间请求转发或包含是使用过滤器

4.实现和设置过滤器

   如何编写一个过滤器
1)必须实现Filter接口
该接口只有一个方法:boolean isLoggable(LogRecord record) 检查是否应该发布给定的日志记录。 
  init(FilterConfig filterConfig)
filterConfig:类似于servlet接口init()方法参数上的ServletConfig,代表过滤器在web.xml

         中配置的信息。
  doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
· 类似于servlet接口的service()方法,在请求来到容器,容器发现调用Servlet的service之前,
可以应用某个过滤器,调用它的doFilter方法。 
执行完doFilter()后,决定是否决定调用FilterChain的doFilter()方法
如果调用FilterChain的doFilter()方法,就会执行下一个过滤器;如果没有
    下一个过滤器,就调用请求目标servlet的service()。
如果因为某个情况(例如用户没有通过验证)而没有调用FilterChain的doFilter()
    则请求不会继续交给接下来的过滤器或目标servlet,这就是所谓的拦截请求(拦截器)。

只需要知道FilterChain运行后会以堆栈顺序返回即可。
  destroy()
   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java