前言

在看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. Iceberg的Copy on Write和Merge On Read介绍

    一.默认的Copy on Write Copy no Write模式指的是在进行更新数据时,先将数据拷贝出来进行相应的更新,再替换掉原先的数据 二.Merge On Read读取时合并 在v2版本才支 ...

  2. .Net Core3.1 集成Log4net

    1.准备 首先nuget添加下引用  Microsoft.Extensions.Logging.Log4Net.AspNetCore 目前的版本为v3.1.0 ,添加完成后我们开始注册. 2.注册 2 ...

  3. 使用 Visual Paradigm 的业务流程模型和符号 (BPMN) 综合指南

    业务流程模型和符号 (BPMN) 是一种用于建模和记录业务流程的标准化图形符号.它被广泛采用,因为它能够提供一种清晰.通用的语言,所有利益相关者(业务分析师.技术开发人员和管理人员)都能理解.Visu ...

  4. 光猫路由器设置-改桥接、开启UPNP和DMZ的教程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 以电信光猫举例,其他网络百度都有对应教程. 电信光猫 ...

  5. CentOS7搭建CDH5.16.2集群 HA高可用(包含Spark2等组件部署)

    CentOS7搭建CDH5.16.2集群 HA高可用   机器准备:(这里HA是对HDFS和YARN的高可用) 主机名 cpu内存 bigdata-master01 8c32G bigdata-mas ...

  6. php服务器如何验证令牌

    在PHP中,令牌通常用于防止跨站请求伪造(CSRF)攻击.以下是一个简单的例子,展示了如何生成和验证令牌: 生成令牌: function generateToken($length = 32) { / ...

  7. TPC-H 研究和优化尝试

    TPC-H测试提供了8张表,最近做这个测试,记录下过程中的关键点备忘. 1.整体理解TPC-H 8张表 2.建立主外键约束后测试22条SQL 3.分区表改造,确认分区字段 4.重新测试22条SQL 5 ...

  8. nginx 配置 vue History模式

    解决 需要加一行 try_files $uri $uri/ /index.html;,其中 /index.html 是你自己的目录中的入口文件 server { listen [::]:80 defa ...

  9. go mgo包 简单封装 mongodb 数据库驱动

    mgo是go编写的mongodb的数据库驱动,集成到项目中进行mongodb的操作很流畅,以下是对其的一些简单封装,具体使用可随意改动封装. 安装 go get gopkg.in/mgo.v2 使用 ...

  10. 朱朝兵《Web前端开发之HTML5+CSS3快速入门》课程资料在线学习

    <Web前端开发之HTML5+CSS3快速入门> [课程简介]本课程由一直专注前端技术与Discuz模板设计与制作!DZ起点网创始人朱朝兵出品,通过本课程学习,即可掌握html5的基本结构 ...