前言

在看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的区别的更多相关文章

  1. 过滤器和拦截器filter和Interceptor的区别

    1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...

  2. filter和interceptor的区别

    前言 最近在面试的时候,被问到了这个问题,觉得答得不是很好,在此进行整理和记录,供自己学习,也希望能帮助到大家. 什么是Filter 在java的javax.servlet下有一个接口Filter.任 ...

  3. filter listener interceptor的区别

    转自: http://www.cnblogs.com/shangxiaofei/p/5328377.html https://www.cnblogs.com/jinb/p/6915351.html 一 ...

  4. Filter 和 interceptor 的区别

    1. 拦截器 interceptor ● 特点:interceptor 依赖于web框架,在Spring<MV中就是依赖于springMVC框架.在实现上是基于Java的反射机制,属于面向切面编 ...

  5. 3.Filter和interceptor的区别

    https://blog.csdn.net/qq_36411874/article/details/53996873

  6. Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

    在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...

  7. 过滤器 Filter 与 拦截器 Interceptor 的区别

    引言 说起 Filter 与 Interceptor 的区别,相信很多同学第一感觉就是容易.简单! 毕竟开发中这两个组件使用频率较高,用法也较简单.然后真回答起来有答不出个所以然来,场面尴尬,老丢脸了 ...

  8. servlet/filter/listener/interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

  9. 过滤器(Filter)与拦截器(Interceptor)区别

    过滤器(Filter)与拦截器(Interceptor)区别 过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途 ...

  10. 【转】servlet/filter/listener/interceptor区别与联系

    原文:https://www.cnblogs.com/doit8791/p/4209442.html 一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台 ...

随机推荐

  1. 什么是Lambda架构?

    一.简介 Lambda架构(Lambda Architecture)是由Twitter工程师南森·马茨(Nathan Marz)提出的大数据处理架构. 这一架构的提出基于马茨在BackType和Twi ...

  2. linux的使用(3)

    1.tar 包 压缩和解压 (1)tar -cvf 打包 (2)tar -xvf 解压压缩包 图片 (3)tar.gz 打包 案例:tar -zcvf ys.tar.gz aa bb hh tt (4 ...

  3. ((GPIO_TypeDef ) GPIOB_BASE)或((GPIO_TypeDef ) xxxx)

    ///////////////((GPIO_TypeDef ) GPIOB_BASE)或((GPIO_TypeDef ) xxxx)//////////////////// #define GPIOA ...

  4. 批量删除MySQL生产环境数据库表或表字段注释脚本

    本文提供了一种批量删除MySQL生产环境中数据库表的注释或表字段注释的方法,通过脚本实现高效维护表结构的清晰性. 一.表注释修改 1.获取删除MySQL数据库表注释脚本select concat('A ...

  5. Typecho 如何开启 HTTPS

    一般来说,我们直接开启 HTTPS 就行,开启后进去网站后台修改网站的 URL 即可. 但是我昨天发现,我的工具箱迁移服务器之后,前台看着是很正常的,但是后台的登陆页面引入的依然的 http 标头,所 ...

  6. 解决Typecho文章cid不连续的教程

    Typecho下文章编号(cid)不连续,虽然不影响什么,也无关紧要,但是对于有强迫症的人(比如我)来说,真的是无法忍受.还好有大佬提供了解决办法. 将以下代码保存为php文件,上传至网站根目录,在浏 ...

  7. Vue3条件与列表渲染深度解析:实战技巧助你高效开发复杂界面

    一.条件渲染的高阶应用 1.1 多分支条件渲染(v-if/v-else-if/v-else) <!-- 评分等级展示案例 --> <div v-if="score > ...

  8. HttpClient 进行soap请求

    当你在使用C#的HttpClient进行SOAP请求时,确保你的代码类似于以下示例: using System; using System.Net.Http; using System.Text; u ...

  9. Proteus中数码管动态扫描显示不全(已解决)

    前言 我是直接把以前写的 51 数码管程序复制过来的,当时看的郭天祥的视频,先送段选,消隐后送位选,最后来个 1ms 的延时. 代码在 Proteus 中数码管静态是可以的,动态显示出了问题--显示不 ...

  10. Ubuntu Nvidia driver驱动安装(新)

    前言 英伟达更新了安装驱动的方式,更新一下文档 旧文:Ubuntu Nvidia driver驱动安装及卸载 下载官方驱动安装 1.安装驱动前一定要更新软件列表和安装必要软件.依赖(必须) sudo ...