WEB编程:Interceptor与Filter

来源:互联网 发布:amtemu v0.8.1 mac 编辑:程序博客网 时间:2024/05/21 17:09

概念

interceptor:interceptor是AOP思想的体现.用于在运行目标程序前、后完成一些制定的动作,如在运行目标程序前进行参数校验,在运行程序后进行资源回收.
filter:filter也是AOP思想的体现,作用跟interceptor差不多.
这里写图片描述

异同

相同点:

  • 都是基于AOP思想,实现横向编程.作用很相似.

不同点:

  • filter是servlet容器原生支持,interceptor需要spring框架支持,底层入口是servlet.底层实现的不同也导致了其使用的范围,interceptor的应用范围不局限于web容器.
  • 在filter前置与servlet的情况下,filter的优先级要高于interceptor的优先级.
  • filter的拦截粒度要比interceptor粗,interceptor的控制精度要高一些.但是filter的作用范围要比interceptor大.filter对所有请求都起作用.
  • 拦截器是基于java的反射机制的,而过滤器是基于函数回调.
  • 配置的文件也不同.filter配置在web.xml文件中,而interceptor可以根据情况配置在任意的xml文件中.

作用域

不同的作用域,决定了职责的大小和可使用的资源数以及访问权限.

  • filter作用于servlet容器范围,interceptor作用于applicationContext范围内.interceptor的执行不会影响到filter,但能获取到filter的执行结果,而filter不能反过来访问interceptor的作用域.
  • filter的作用域要比interceptor广,但是粒度较粗,底层由servlet容器封装,改造的空间小.而interceptor是基于spring框架的,可改造性大.粒度可由开发者控制.
  • filter无法通过url获取到对应的处理方法,而interceptor可以通过url获取到对应的处理方法.因为spring内部control的requestMapping保存了url和method的mapping关系.
    这里写图片描述

拦截例外放过

如果要对某些请求放过,filter和interceptor需要有白名单机制.

  • filter可以在filter-mapping上对url进行精确划分,也可以在代码层的init方法中,做url适配.
  • interceptor可以在配置拦截器的时候,使用exclude-mapping进行放过.

interceptor与filter混用

混用的原因:有些项目由于历史原因,既有interceptor,也有filter.在这种情况下,需要根据场景的情况,考虑interceptor与filter之间的优先级.如果顺序不当,则可能导致拦截顺序不对,执行效果与预期不一样.
从两者的异同就可以看出来,两者的执行顺序如下图所示:
这里写图片描述

拦截范围设定

web容器一种,一般我们都根据url路径来进行拦截或者过滤.两者在写法上有一点区别

  • 在filter中,/可以匹配全部路径,而在interceptor中,只能匹配一个路径,需要所有匹配得是/*的写法.interceptor支持正则表达式和Spring EL表达式
  • 当url-pattern配置成/的时候,Tomcat会将所有的请求交给对应的Servlet进行处理,当url-pattern配置成/的时候,多数情况下与/效果一致,但是,当访问的路径正好对应jsp文件时,Tomcat会访问真实的jsp文件而不是把请求交给对应的Servlet处理。

加载顺序

servlet、filter、listener的配置顺序与加载顺序:

加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加 载 filter。但是配置顺序尽量与加载顺序一致,也方便管理

web.xml 的加载顺序是:context- param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据 对应的 mapping 的顺序进行调用的。

参考

  • Servlet url-pattern /与/*区别
  • Java过滤器,SpringMVC拦截器之间的一顺序点关系
  • Spring filter和拦截器(Interceptor)的区别和执行顺序
  • Spring拦截器中通过request获取到该请求对应Controller中的method对象
  • servlet、filter、listener继承的基类和获得作用域的方式
  • SpringMVC请求的时候是如何找到正确的Controller(写得很好)
  • 获取SpringMVC中所有RequestMapping映射URL地址
  • SpringMVC 深度解析@RequestMapping(一)
  • SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系
  • springmvc interceptor拦截器