过滤器Filter和拦截器Interceptor的区别

一、过滤器Filter

1. 简介

过滤器(Filter),是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。过滤器Filter需要实现javax.servlet.Filter接口,在该接口中定义了如下三个方法。

  • init:用于完成Filter的初始化。
  • destory:用于Filter销毁前,完成某些资源的回收。
  • doFilter:实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
    在这里插入图片描述

2. 作用

拦截到后可以做什么功能呢?
过滤器一般完成一些通用的操作。 比如每个资源都要写一些代码完成某个功能,我们总不能在每个资源中写这样的代码吧,而此时我们可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。

比如,当用户访问某个系统的首页,我们希望实现的效果是用户如果登录过了就跳转到首页,如果没有登录就跳转到登录页面让用户进行登录,要实现这个效果需要在每一个资源中都写上这段逻辑,而像这种通用的操作,我们就可以放在过滤器中进行实现。这个就是权限控制
此外,过滤器还可以做统一编码处理敏感字符处理过滤掉非法url设置字符集控制转向做一些业务逻辑判断等。

3. 过滤器链

过滤器链是指在一个Web应用中,可以配置多个过滤器,这多个过滤器称为过滤器链。
在这里插入图片描述
上图中的过滤器链执行是按照以下流程执行:

  1. 执行 Filter1 的放行前逻辑代码
  2. 执行 Filter1 的放行代码
  3. 执行 Filter2 的放行前逻辑代码
  4. 执行 Filter2 的放行代码
  5. 访问到资源
  6. 执行 Filter2 的放行后逻辑代码
  7. 执行 Filter1 的放行后逻辑代码

以上流程串起来就像一条链子,故称之为过滤器链。

过滤器执行的先后顺序如何判断?

  • 注解配置: 按照过滤器类名的字符串比较规则比较,值小的先执行。如: AFilter 和 BFilter,AFilter就先执行了。
  • web.xml配置: 谁定义在上边,谁先执行

二、拦截器Interceptor

1. 简介

讲解拦截器的概念之前,我们先看一张图:
在这里插入图片描述(1) 浏览器发送一个请求会先到Tomcat的web服务器
(2) Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源
(3) 如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问
(4) 如果是动态资源,就需要交给项目的后台代码进行处理
(5) 在找到具体的方法之前,我们可以去配置过滤器(可以配置多个),按照顺序进行执行
(6) 然后进入到到中央处理器(SpringMVC中的内容),SpringMVC会根据配置的规则进行拦截
(7) 如果满足规则,则进行处理,找到其对应的controller类中的方法进行执行,完成后返回结果
(8) 如果不满足规则,则不进行处理
(9) 这个时候,如果我们需要在每个Controller方法执行的前后添加业务,具体该如何来实现?

这个就是拦截器要做的事。
拦截器(Interceptor) 是一种动态拦截方法调用的机制,在Spring MVC中动态拦截控制器方法的执行。拦截器是面向切面编程的,基于Java的反射机制。就是在你的Service或者一个方法前调用一个方法,或者在方法后调用一个方法。拦截器需要实现org.springframework.web.servlet包的HandlerInterceptor。此接口中定义了三个方法:

  • preHandle:在执行实际处理程序之前调用。
  • postHandle:在执行玩实际程序之后调用。
  • afterCompletion:在完成请求后调用。

说明:
拦截器中的preHandler方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法;如果返回false,则代表拦截,后面的就不会再执行了。
在这里插入图片描述

2. 作用

  • 在指定的方法调用前后执行预先设定的代码。比如可以在调用方法前打印字符串,也可在调用方法后做其他的业务逻辑。
  • 阻止原始方法的执行。
  • 动态代理就是拦截器的简单实现。

总结: 拦截器就是用来做增强的。

3. 拦截器链

当配置多个拦截器时,形成拦截器链。
拦截器链的运行顺序参照拦截器添加顺序为准
当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行。
当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作
在这里插入图片描述
preHandle:与配置顺序相同,必定运行

postHandle:与配置顺序相反,可能不运行

afterCompletion:与配置顺序相反,可能不运行。

这个顺序不太好记,最终只需要把握住一个原则即可:以最终的运行结果为准

三、区别

  • 归属不同: Filter属于Servlet技术,Interceptor属于SpringMVC技术
  • 拦截内容不同: Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

具体来说:
① 拦截器是基于java的反射机制的,而过滤器是基于函数的回调。
② 拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
③ 拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④ 拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。
⑤ 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

四、Filter、Interceptor、Servlet包含关系

在这里插入图片描述

参考链接
https://blog.csdn.net/weixin_44502804/article/details/93139550

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值