拦截器和过滤器的执行顺序和区别
1. 拦截器和过滤器的概念
1.1. 过滤器概念
- 过滤器
Filter
是JavaEE标准,在Servlet
的规范中定义的,是Servlet
容器支持的,是属于Servlet
容器的,依赖Servlet
容器; - 若用配置文件方式(servlet3.0以下版本)配置,
Filter
配置在web.xml
中,Interceptor
配置在Spring MVC的配置文件中。多个过滤器的执行顺序跟在web.xml
文件中定义的先后关系有关。多个拦截器它们之间的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关。 - 过滤器
Filter
是基于函数回调实现(容器初始化调用);拦截器是基于java的反射机制实现,属于面向切面编程(AOP)的一种运用。
1.2. 拦截器概念
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
- 拦截器不依赖与
servlet
容器,过滤器依赖与servlet
容器。 - 拦截器只能对
action
请求起作用,而过滤器则可以对几乎所有的请求起作用。 - 拦截器可以访问
action
上下文、值栈里的对象,而过滤器不能访问。 - 拦截器依赖于Spring框架,所以只能对
Controller
请求进行拦截而对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理,而过滤器则可以对几乎所有的请求起作用。
2. 两者区别:
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
- 拦截器不依赖与
servlet
容器,过滤器依赖与servlet
容器。 - 拦截器只能对
action
请求起作用,而过滤器则可以对几乎所有的请求起作用。 - 拦截器可以访问
action
上下文、值栈里的对象,而过滤器不能访问。 - 在
action
的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。 - 拦截器可以获取
IOC
容器中的各个bean
,而过滤器就不行,这点很重要,在拦截器里注入一个service
,可以调用业务逻辑。 - 拦截器
Interceptor
是Spring的组件之一,是属于Spring框架的,依赖于Spring框架,归Spring管理,配置在Spring的文件中,因此能使用Spring里的任何资源和对象,例如Service
对象、数据源、事务管理等(所有Spring容器管理的bean
),所以可以通过Spring的IOC注入方式注入即可,而Filter
不可以。 - 若用配置文件方式(servlet3.0以下版本)配置,Filter配置在web.xml中,Interceptor配置在Spring MVC的配置文件中。多个过滤器的执行顺序跟在web.xml文件中定义的先后关系有关。多个拦截器它们之间的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关。
- 过滤器Filter是基于函数回调实现;拦截器是基于java的反射机制实现,属于面向切面编程(AOP)的一种运用。
- 拦截器是Spring组件之一,所以可以访问
action
上下文、栈里的对象、Spring容器管理的bean,而过滤器不能访问。 - 在
action
上下文的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化是被调用一次。
3. 触发时机
3.1. 代码示例
3.1.1. MyFilter.java
过滤器写法,实现javax.servlet.Filter
接口
import javax.servlet.*;
import java.io.IOException;/*** @author five-five* @createTime 2022/3/2 10:37*/
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("before...");chain.doFilter(request, response);System.out.println("after...");}@Overridepublic void destroy() {}
}
3.1.2. MyInterceptor.java
拦截器写法,实现org.springframework.web.servlet.HandlerInterceptor
接口,也可继承org.springframework.web.servlet.HandlerInterceptor
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @author five-five* @createTime 2022/3/2 10:38*/
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");}
}
3.2. 说明
3.2.1. 过滤器说明
过滤器是在请求进入容器后,但请求进入servlet
之前进行预处理的。请求结束返回也是,是在servlet
处理完后,返回给前端之前。
3.2.2. 拦截器说明
a.preHandle()
这个方法是在过滤器的chain.doFilter(request, response)
方法的前一步执行,也就是在
System.out.println("before...");
chain.doFilter(request, response);
postHandle()
方法之后,在return ModelAndView
之前进行,可以操控Controller
的ModelAndView
内容。
afterCompletion()
方法是在过滤器返回给前端前一步执行,也就是在
chain.doFilter(request, response);
System.out.println("after...");
SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的
service()
方法中执行的。
3.2.3. 执行顺序
所以过滤器、拦截器、service()
方法,dispatch()
方法的执行顺序应该是这样的。
4. 总结
- 灵活性上说拦截器
Interceptor
功能更强大些,Filter
能做的事情,Interceptor
都能做,而且可以在请求前,请求后执行,异常抛出时,比较灵活。 Filter
主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor
。
拦截器和过滤器的执行顺序和区别相关推荐
- Java中拦截器和过滤器的声明用途和区别
过滤器: 1.基于Servlet框架 2.Oracle公司的任何Java Web框架都可以用 3.可以拦截任何资源,包括 .jsp .java .html等等 拦截器: 1.基于SpringMvc框架 ...
- 区分Java拦截器和过滤器
今天带大家分析java拦截器和过滤器的区别,文中有非常详细的解释说明,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.过滤器(filter) 过滤器处于客户端与Web资源(Serv ...
- 关于SSM框架设置拦截器和过滤器
我们知道拦截器和过滤器都是在项目中起到拦截过滤请求的功能,所以可能在设置的时候会傻傻分不清.这里我们先来比较它们的区别. 过滤器Filter是JavaEE标准,在Servlet的规范中定义的,是Ser ...
- 详解拦截器和过滤器的区别
拦截器和过滤器的区别 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对acti ...
- java 拦截器和过滤器的区别
介绍 在 Java Web 应用程序中,拦截器和过滤器是两种不同的机制,用于在请求/响应处理过程中进行拦截和过滤.两者都可以用来在请求到达目标资源之前对其进行预处理.修改或拦截. 但是,拦截器和过滤器 ...
- 拦截器和过滤器有什么区别?
首先了解什么是过滤器什么是拦截器 ①过滤器(Filter) 过滤器通过直接实现Filter接口实现,也可以通过@WebFilter注解实现特定的URL拦截 在Filter接口中定义了三个方法: ini ...
- SpringBoot 拦截器和过滤器
拦截器和过滤器 时光飞逝,最近也是很忙,但是忙到最后发现在自己并没有太多的成长 工作 学习 生活 没想到成长是不经意间的,像是被 推着,让你身不由己 午休时间,写写博客,也是保留一些自己的时间和空间 ...
- 【SpringMVC】拦截器和过滤器
拦截器: 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口. 拦截器和过滤器类似,功能方向侧重点不同. 过滤器是用来过滤器请求参数,设置编码字符集等工作. 拦截器是 ...
- 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别
转自:https://www.cnblogs.com/shangc/p/5939708.html 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别.其主要区别为以下几点: 1)拦截器是基于 ...
- struts2中拦截器和过滤器的比较
拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...
最新文章
- Android中Service生命周期、启动、绑定、混合使用
- html text alt,HTML alt text for image maps
- Nginx之让用户通过用户名密码认证访问web站点
- kail Linux 安装Parallels Tools
- VerilogHDL8位串行乘法器的分析(2)
- java厨房_Java多线程基础
- (转)会议期刊论文发表介绍(计算机科学领域)
- Windows游戏编程大师技巧笔记(一些基础)
- 超星阅读器pdz文件转为xps文件或pdf文件说明
- Autojs 3.0文档学习之设备信息
- 计算机怎么没有word文档,电脑新建没有word文档怎么办 没有Word解决方法
- 炸裂了!来了一波新年微信红包封面,抓紧领取,先到先得!
- 一页纸说清楚“什么是深度学习?”
- 5G基础_06 降低时延技术
- 小技巧,windows电脑上多开软件的办法
- 计组 | 寻址范围的概念与数据寄存器的位数
- Android权限 - 权限分类
- vue.js devtools
- 控制与决策latex排版解答
- 【智能制造】博创智能注塑生产智能化应用之路