文章目录
一、过滤器Filter
1. 简介
过滤器(Filter),是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。过滤器Filter需要实现javax.servlet.Filter
接口,在该接口中定义了如下三个方法。
- init:用于完成Filter的初始化。
- destory:用于Filter销毁前,完成某些资源的回收。
- doFilter:实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
2. 作用
拦截到后可以做什么功能呢?
过滤器一般完成一些通用的操作。 比如每个资源都要写一些代码完成某个功能,我们总不能在每个资源中写这样的代码吧,而此时我们可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。
比如,当用户访问某个系统的首页,我们希望实现的效果是用户如果登录过了就跳转到首页,如果没有登录就跳转到登录页面让用户进行登录,要实现这个效果需要在每一个资源中都写上这段逻辑,而像这种通用的操作,我们就可以放在过滤器中进行实现。这个就是权限控制。
此外,过滤器还可以做统一编码处理、 敏感字符处理、过滤掉非法url、设置字符集、控制转向、做一些业务逻辑判断等。
3. 过滤器链
过滤器链是指在一个Web应用中,可以配置多个过滤器,这多个过滤器称为过滤器链。
上图中的过滤器链执行是按照以下流程执行:
- 执行
Filter1
的放行前逻辑代码 - 执行
Filter1
的放行代码 - 执行
Filter2
的放行前逻辑代码 - 执行
Filter2
的放行代码 - 访问到资源
- 执行
Filter2
的放行后逻辑代码 - 执行
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