Filter与Interceptor的区别
前言
在看springboot项目时,其中的会话持续时,了解到token,session,jwt等方法,但是接着我就了解到过滤器(Filter)以及拦截器(Interceptor),感觉这两个东西真的有够像的了,也是去看了好多篇文章。接下来就分别讲一下,Filter与Interceptor,最后讲一下两者的区别。(本篇参考了几篇博客,我会在对应处留下链接的)
过滤器(Filter)
基于Servlet实现,是将java web传入的request、以及响应的response提前过滤掉一些信息或设置一点参数。
Filter过滤器随web应用的启动而启动,且只初始化一次。
Filter接口内,需实现init、doFilter以及destroy方法
void init(FilterConfig filterConfig):容器启动会调用用于初始化,整个程序运行期只会被调用一次。
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain):doFilter为具体的过滤功能代码。
void destroy():当Filter 要销毁时,进行相关资源的回收工作。
拦截器(Interceptor)
是SpringMVC中实现的一种基于Java反射,是在Action执行的前后执行一段代码或执行前阻止其执行。
需实现preHandle、postHandle以及afterCompletion方法
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):在请求前被调用。就如我们开始说的jwt的问题,在执行操作之前会先要验证用户的登录信息,这个就可以在这个方法中实现,如果验证成功则返回 true,继续执行数据操作业务;否则就返回 false,后续操作数据的业务就不会被执行了。
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):调用请求方法之后执行,但它会在 DispatcherServlet (前端控制器)进行渲染视图之前被执行。
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):会在请求结束之后再执行,也就是在 DispatcherServlet (前端控制器)渲染了对应的视图之后再执行。
主要区别
1.Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理。
2.过滤器是在请求进入容器后、进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
就是过滤器会先执行,然后才会执行拦截器,执行时机不同。
(图片来源https://cloud.tencent.com/developer/article/2142914)

3.最简单明了的区别(参考https://zhuanlan.zhihu.com/p/340397290)
过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法
过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
切片(Aspect): 可以拿到方法的参数,但是却拿不到http请求和响应的对象
4.使用场景
拦截器使用场景:
登录验证,判断用户是否登录。
权限验证,判断用户是否有权限访问资源,如校验token
过滤器使用场景:
URL级别的权限访问控制
过滤敏感词汇(防止sql注入)
设置字符编码
最后我看到一个问题:拦截器只能拦截部分web请求,这句话怎么理解?(https://segmentfault.com/a/1190000037755221#item-4-1)
拦截器的拦截,是基于java反射机实现,拦截对象只能是实现了接口的类,而不能拦截url这种链接
Filter与Interceptor的区别的更多相关文章
- 过滤器和拦截器filter和Interceptor的区别
1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...
- filter和interceptor的区别
前言 最近在面试的时候,被问到了这个问题,觉得答得不是很好,在此进行整理和记录,供自己学习,也希望能帮助到大家. 什么是Filter 在java的javax.servlet下有一个接口Filter.任 ...
- filter listener interceptor的区别
转自: http://www.cnblogs.com/shangxiaofei/p/5328377.html https://www.cnblogs.com/jinb/p/6915351.html 一 ...
- Filter 和 interceptor 的区别
1. 拦截器 interceptor ● 特点:interceptor 依赖于web框架,在Spring<MV中就是依赖于springMVC框架.在实现上是基于Java的反射机制,属于面向切面编 ...
- 3.Filter和interceptor的区别
https://blog.csdn.net/qq_36411874/article/details/53996873
- Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...
- 过滤器 Filter 与 拦截器 Interceptor 的区别
引言 说起 Filter 与 Interceptor 的区别,相信很多同学第一感觉就是容易.简单! 毕竟开发中这两个组件使用频率较高,用法也较简单.然后真回答起来有答不出个所以然来,场面尴尬,老丢脸了 ...
- servlet/filter/listener/interceptor区别与联系
转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...
- 过滤器(Filter)与拦截器(Interceptor)区别
过滤器(Filter)与拦截器(Interceptor)区别 过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途 ...
- 【转】servlet/filter/listener/interceptor区别与联系
原文:https://www.cnblogs.com/doit8791/p/4209442.html 一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台 ...
随机推荐
- 大数据HDFS集群相关概念
一.Zookeeper服务 端口 描述 配置路径 2181 主要使用端口,对cline端提供服务.连接方式jdbc:hive2://ip:2181 conf/zoo.cfg中clientPort 21 ...
- nacos(六): 创建第一个多模块微服务项目(生产者与消费者)
要创建出生产者与消费者一体的多模块项目,总体来说分成三个步骤.分别是先创建出项目主体,再分别创建出生产者与消费者. 步骤一:创建项目主体 1. 先创建一个单体项目作为项目的主题.在这里,我们不用脚手架 ...
- maven - [02] settings.xml配置
maven处理配置的优先级顺序 (1)全局settings.xml(优先级★☆☆☆☆) 位于Maven安装目录的conf/settings.xml,提供系统级的默认配置,比如本地仓库位置.远程仓库列表 ...
- DW - 问题
数据库三范式 1NF(First Normal Form):一个关系模式符合 1NF 的定义,则该关系模式是简单的.简单的意思就是不存在从属或重复的属性,即每个属性都是原子性的. 2NF(Second ...
- MySQL索引最左原则:从原理到实战的深度解析
MySQL索引最左原则:从原理到实战的深度解析 一.什么是索引最左原则? 索引最左原则是MySQL复合索引使用的核心规则,简单来说: "当使用复合索引(多列索引)时,查询条件必须从索引的最左 ...
- Anaconda使用记录
1 安装 windows下,安装完添加环境变量(哦安装时勾选添加环境变量选项就是加这些变量的) ## (记anaconda软件目录为%ANACONDA3%) %ANACONDA3%\ %ANACOND ...
- ubuntu 22.04 deskop 无法打开terminal
系统语言设置的问题,改为汉语即可
- GBJ 97-1987 水泥混凝土路面施工及验收规范(电子版)PDF 版本 下载
本规范适用于新建和改建的公路 城市道路 厂矿道路和民航机场道面等就地浇筑的水泥混凝土路面的施工及验收 链接:https://pan.baidu.com/s/17t88jnEU6IrptmEWsyuN3 ...
- 通过 JS 修改具体标签的属性的属性值
博客地址:https://www.cnblogs.com/zylyehuo/ window.addEventListener('DOMContentLoaded', function() { var ...
- 从上下文切换谈thread_local工作原理
从上下文切换谈thread_local工作原理 thread_local是什么 熟悉多线程编程的小伙伴一定对thread_local不陌生,thread_local 是 C++11 引入的一种存储类说 ...