过滤器、监听器、拦截器的区别

过滤器、监听器、拦截器的区别

  • 过滤器(filter)、监听器(Listener)是JavaWeb的三大组件。
  • 而拦截器(Interceptor)是Spring框架中的。

我们主要是要分清除过滤器和拦截器的区别:

  1. 实现原理:过滤器是基于函数回调实现的,而拦截器是基于java的反射机制
  2. 使用范围:过滤器Filter的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。而拦截器是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
  3. 触发时机:![[Pasted image 20240602162705.png]]
    ![[Pasted image 20240602162846.png]]
    从图中我看可以看出,过滤器Filter是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。而拦截器Interceptor是在请求进入servlet后,在进入Controller之前进行预处理的,Controller中渲染了对应的视图之后请求结束。

执行顺序

配置Filter:

package com.qcby.demo.config;import org.springframework.stereotype.Component;import javax.servlet.*;
import java.io.IOException;@Component
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Filter 前置过滤");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter 处理中");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.out.println("Filter 后置过滤");}
}

自定义拦截器

package com.qcby.demo.config;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Interceptor 前置拦截");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Interceptor 后置拦截");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Interceptor 最终拦截");}
}

配置拦截器

package com.qcby.demo.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 设置要拦截的.excludePathPatterns("/test1");// 设置不拦截的}
}

控制器

package com.qcby.demo;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("test")
public class TestController {@GetMapping("/test1")public String test() {return "123456";}
}

项目启动之后,我们会发现过滤器的init()方法,随着容器的启动进行了初始化:
![[Pasted image 20240602182638.png]]

然后浏览器访问对应的端口号:http://localhost:8080/test/test1,会有以下输出:
![[Pasted image 20240602185048.png]]

这样就验证了我们前边的过滤器和拦截器的触发顺序。
对于拦截器的触发时机,在只有一个拦截器时:
![[Pasted image 20240602185232.png]]

有多个拦截器时
![[Pasted image 20240602185303.png]]

过滤器的应用场景

  1. 过滤敏感词汇(防止sql注入)
  2. 设置字符编码
  3. URL级别的权限访问控制
  4. 压缩响应信息

拦截器的应用场景

  1. 登录验证,判断用户是否登录。
  2. 权限验证,判断用户是否有权限访问资源,如校验token
  3. 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
  4. 处理cookie、本地化、国际化、主题等。
  5. 性能监控,监控请求处理时长等。
  6. 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

参考文献

  • Springboot——拦截器
  • 过滤器 和 拦截器的 6个区别,别再傻傻分不清了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

overleaf 写参考文献引用

目录 1、 新建.bib 文件 2、导入引用 3、在文档中引用参考文献 4、生成参考文献列表 1、 新建.bib 文件 在Overleaf项目中,你可以选择导入现有的 .bib 文件或在项目中创建一个新的 .bib 文件来管理你的参考文献。 导入.bib 文件: 在项目文件树中点击…

11. RBAC权限管理从零到一实现(二)

前端页面已提交至git https://github.com/SJshenjian/cloud-web默认用户名密码admin 1

MySql 数据类型选择与优化

选择优化的数据类型 更小的通常更好 一般情况下尽量使用可以正确存储数据的最小类型。更小的数据类型通常更快,因为它们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周期也更少。但也要确保没有低估需要存储值的范围。 简单就好 简单的…

【自然语言处理】【Scaling Law】Observational Scaling Laws:跨不同模型构建Scaling Law

相关博客 【自然语言处理】【Scaling Law】Observational Scaling Laws:跨不同模型构建Scaling Law 【自然语言处理】【Scaling Law】语言模型物理学 第3.3部分:知识容量Scaling Laws 【自然语言处理】Transformer中的一种线性特征 【自然语言处理】【大…

jmeter性能优化之tomcat配置与基础调优

一、 修改tomcat初始和最大堆内存 进入到/usr/local/tomcat7-8083/bin目录下,编辑catalina.sh文件,,默认堆内存是600m,初始堆内存和最大堆内存保持一致, 可以更改到本机内存的70%,对于Linux系统&#xff0…

conda创建虚拟环境并激活

1 conda activate base 2 conda creat -n aaa python** 3 conda activate aaa 4 interpreter里面去选择刚搞好的编译器 ...../conda.exe

【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件

本文摘要:四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件 😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xf…

【操作系统】Windows平台捕获崩溃现场底层原理,附代码亲测MiniDumpWriteDump

MiniDumpWriteDump 是一个Windows API函数,它属于DbgHelp.dll库,用于生成程序崩溃时的内存转储文件(MiniDump)。这个函数是Windows平台下用于捕获程序崩溃时的内存状态的常用方法之一。以下是MiniDumpWriteDump函数的原理和工作流…

【C++】ios::sync_with_stdio(false) 与 cin.tie(nullptr) 加速 IO

一、前言 之前写题遇到大数据量(cin、cout 数据量级达到 1e5、1e6 ),因为考虑 IO 性能报错 TLE,故选择 scanf、printf 替代 cin、cout,以解决问题。一直以来没有深入研究其中原因,只知关键词——同步&…

设计模式(十三)行为型模式---命令模式

文章目录 命令模式简介结构UML图具体实现UML图代码实现 命令模式简介 命令模式(command pattern)也叫动作模式或者事务模式。它是将请求(命令)封装成对象,使得可以用不同的请求对客户端进行参数化,具体的请…

MD中 面料的物理属性参数

该图片是Marvelous Designer软件中"Fabric Physical Properties"(面料物理属性)面板的截图,用于调整面料在弯曲、折叠时的硬度(Buckling Stiffness)。 目标部分解释了调整Buckling Stiffness的作用:通过调整该百分比值来决定面料角落处的硬度。进入80%的Buckling St…

笔记-anaconda配置Python环境

查看环境 conda env list 创建python name环境,python版本为3.9: conda create -n name python3.9 激活: conda activate name 去掉激活: conda deactivate name 进入pandas目录: cd D:\学习\pyton\antpy代码\ant-learn-…

NXP RT1060学习总结 - CANFD功能

1、RT1060-CAN FD功能简介 这里使用RT1060系列的1064芯片进行开发,测试板是官方提供的开发板;RT1060系列支持3路CAN功能,CAN1和CAN2只能最为普通的CAN外设,支持CAN2.0,而CAN3支持CAN-FD功能;CAN-FD功能这里…

【LeetCode 77. 组合】

1. 题目 2. 分析 本题有个难点在于如何保存深搜得到的结果?总结了一下,深搜处理的代码,关于返回值有三大类。 第一类:层层传递,将最深层的结果传上来;这类题有:【反转链表】 第二类&#xff1…

域名/子域名接管漏洞

域名/子域名接管漏洞 1.域接管2.子域接管子域接管概述使用BBOT扫描可劫持的子域通过DNS通配符生成子域接管 3.利用子域接管4.子域名接管防御手段 1.域接管 如果您发现某个域名被某个服务使用,但公司已经失去了对其的所有权,您可以尝试注册它&#xff08…

默认路由,直接路由,静态路由,动态路由

对于华为设备,如华为路由器或交换机,设置这些路由类型需要通过设备的管理界面或命令行界面进行配置。以下是一般情况下如何在华为设备上设置这些路由类型的指导: 默认路由: 使用命令行界面(CLI)&#xff0c…

QMatrix详解

一、定义 QMatrix是Qt框架中的一个类,它表示一个2x3的变换矩阵,通常用于进行二维图形的几何变换。这个类允许你对图形进行平移、缩放、旋转和剪切等操作。 二、功能 QMatrix的主要功能是提供一个便捷的方式来对二维图形进行线性变换。通过构建一个变换…

CS和msf的权限传递,利用mimikatz抓取win10明文密码

一、Cobaltstrike的安装 http://t.csdnimg.cn/yhZin 安装CobaltStrike,浏览博主的上篇文章即可!!! 这里我在自己的本机win11上执行了Client去连接kali中的Server端,直接执行.cmd文件即可!!&…

【vscode】ctrl+shift+end选中以下所有行删除

总结,ctrlshiftend选中以下所有行 以下由chatgpt生成 在 Visual Studio Code(VS Code)中,如果你想要选中当前光标所在的一行及之后的所有行并删除它们,可以通过组合键操作来实现。这种功能在编辑大型文件时特别有用&am…

【计算机毕业设计】基于SSM++jsp的校园驿站管理系统【源码+lw+部署文档】

目录 第1章 绪论 1.1 课题背景 1.2 课题意义 1.3 研究内容 第2章 开发环境与技术 2.1 MYSQL数据库 2.2 JSP技术 2.3 SSM框架 第3章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程 3.2.1 操作流程 3.2.2 登录流程 3.2.3 删除信息流…