当前位置: 首页 > news >正文

谈谈 Spring 的过滤器和拦截器

前言

我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景。

(本文的代码实现首先是基于 SpringBoot,Spring 的实现方式仅简单描述)


image.png

1. 过滤器

1.1. 什么是过滤器

过滤器(Filter),是 Servlet 规范规定的,在 Servlet 前执行的。用于拦截和处理 HTTP 请求和响应,可用于身份认证、授权、日志记录和设置字符集(CharacterEncodingFilter)等场景。

过滤器位于整个请求处理流程的最前端,因此在请求到达 Controller 层前,都会先被过滤器处理。

过滤器可以拦截多个请求或响应,一个请求或响应也可以被多个过滤器拦截

1.2. 如何创建过滤器

Filter 的生命周期对应的三个关键方法:

下面将介绍二种方法创建 Filter。

1.2.1 实现 Filter 接口

1.创建 Filter 处理类,实现javax.servlet.Filter接口,加上@WebFilter注解配置拦截 Url,但是不能指定过滤器执行顺序,也可通过web.xml配置。

@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 用于完成 Filter 的初始化Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤器已经拦截成功!!!");// 执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。chain.doFilter(request,response);}@Overridepublic void destroy() {// 用于 Filter 销毁前,完成某些资源的回收;Filter.super.destroy();}
}

2.在启动类添加注解@ServletComponentScan ,让 Spring 可以扫描到。

@SpringBootApplication
@ServletComponentScan
public class MyFilterDemoApplication {public static void main(String[] args) {SpringApplication.run(MyFilterDemoApplication.class, args);}}

3.创建 Controller 发起 Url 请求。

@RestController
public class MyFilterController {@GetMapping("/testFilter")public String testFilter(){return "Hello World";}
}

拦截结果

image.png

1.2.2. 通过@Component 注解

1.创建 Filter 处理类,实现javax.servlet.Filter接口,加@Component注解。

  • 可以使用@Order注解保证过滤器执行顺序,不加则按照类名排序。

  • 过滤器不能指定拦截的url , 只能默认拦截全部

@Component
@Order(1)
public class MyComponentFilter1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("我是过滤器1已经拦截成功!!!");chain.doFilter(request,response);}@Overridepublic void destroy() {Filter.super.destroy();}
}

@Component
@Order(2)
public class MyComponentFilter2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println("我是过滤器2已经拦截成功!!!");chain.doFilter(request,response);}@Overridepublic void destroy() {Filter.super.destroy();}
}

2-3 步骤同 1.2.1,结果如下。

image.png


2. 拦截器

2.1. 什么是拦截器

拦截器(Interceptor),和Servlet无关,由Spring框架实现。可用于身份认证、授权、日志记录、预先设置数据以及统计方法的执行效率等。一般基于 Java 的反射机制实现,属于AOP的一种运用。

目前了解的 Spring 中的拦截器有:

  • HandlerInterceptor

  • MethodInterceptor

2.2. HandlerInterceptor 拦截器

2.2.1简介

HandlerInterceptor 类似 Filter,拦截的是请求地址 ,但提供更精细的的控制能力,这里注意下必须过DispatcherServlet 的请求才会被拦截。

它允许你在请求处理前、处理后以及视图渲染完成前执行自定义逻辑,可以用来对请求地址做一些认证授权、预处理,也可以计算一个请求的响应时间等,还可以处理跨域(CORS)问题

简单的执行流程描述:

  1. 请求到达 DispatcherServlet,然后发送至 Interceptor,执行 preHandler;

  2. 请求到达 Controller,请求结束后,执行 postHandler。

2.2.2如何实现

  1. 创建 Interceptor 类,实现HandlerInterceptor接口,重写 3 个方法,加@Component注解。

image.png

@Component
public class MyHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//请求开始时间long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);System.out.println("startTime : " +  new Date(startTime));return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {long startTime = (Long)request.getAttribute("startTime");long endTime = System.currentTimeMillis();// 统计耗时long executeTime = endTime - startTime;System.out.println("executeTime : " + executeTime + "ms");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

2.配置拦截器,实现WebMvcConfigurer接口,加@Configuration注解并重写addInterceptors方法。

@Configuration
public class MyWebConfigurer implements WebMvcConfigurer {@Resourceprivate MyHandlerInterceptor myHandlerInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {List<String> patterns = new ArrayList<>();patterns.add("/test/handlerInterceptor");registry.addInterceptor(myHandlerInterceptor).addPathPatterns(patterns) // 需要拦截的请求.excludePathPatterns(); // 不需要拦截的请求}
}

拦截结果如下:

image.png

Spring 项目如何实现?

可通过使用mvc:interceptors标签来声明需要加入到 SpringMVC 拦截器链中的拦截器。


2.3. MethodInterceptor 拦截器

2.3.1. 简介

MethodInterceptor 是 AOP 中的拦截器,它拦截的目标是方法,可以不是 Controller 中的方法。

在对一些普通的方法上的拦截可以使用该拦截器,这是 HandlerInterceptor 无法实现的。

可用来进行方法级别的身份认证、授权以及日志记录等,也可基于自定义注解实现一些通用的方法增强功能

2.3.2. 如何实现

MethodInterceptor 是基于 AOP 实现的,所以根据不同的代理有多种实现方式,更多的实现方式和原理我将在整理 Spring AOP 的时候详细接受。

这里我将介绍通过BeanNameAutoProxyCreator自动代理实现拦截。该类是基于 Bean 名称的自动代理,可以针对特定的Bean进行个性化的 AOP 配置。

1.创建简单的需要拦截的方法。

public interface UserService {public String getUser();
}

@Component
public class UserServiceImpl implements UserService{@Overridepublic String getUser() {return "我是福星";}
}

2.创建 Interceptor 类,实现MethodInterceptor接口,重写invoke方法,加@Component注解。

@Component
public class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("进入拦截,方法执行前,拦截方法是:" + invocation.getMethod().getName());Object result = invocation.proceed();System.out.println("方法执行后");return result;}}

3.配置自动代理,加@Configuration注解并创建自动代理BeanNameAutoProxyCreator

@Configuration
public class MyMethodConfigurer {@Resourceprivate MyMethodInterceptor myMethodInterceptor;@Beanpublic BeanNameAutoProxyCreator beanNameAutoProxyCreator() {// 使用BeanNameAutoProxyCreator来创建代理BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();// 指定一组需要自动代理的Bean名称,Bean名称可以使用*通配符beanNameAutoProxyCreator.setBeanNames("user*");//设置拦截器名称,这些拦截器是有先后顺序的beanNameAutoProxyCreator.setInterceptorNames("myMethodInterceptor");return beanNameAutoProxyCreator;}}

发起请求后,调用该方法前会进行拦截。

image.png


3. 总结

过滤器一般用于对 Servlet 请求和响应进行通用性的处理,通常关注请求和响应内容,而不涉及具体的业务逻辑。而拦截器用于对 SpringMVC 的请求和响应进行特定的业务处理,通常与控制器层的请求处理有关。

不论是过滤器和拦截器,都可以有多个。执行顺序上拦截器是由配置中的顺序决定,而过滤器可通过@Component+@Order决定,也可由web.xml文件中的配置顺序决定。

总的来说,拦截器的使用更加灵活,Filter 能做的事情,拦截器也能做。Filter 一般用于对 URL 请求做编码处理、过滤无用参数、安全校验(比如登陆态校验),如果涉及业务逻辑上的,还是建议用拦截器。

文章转载自:fuxing.

原文链接:https://www.cnblogs.com/fuxing/p/18188764

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关文章:

谈谈 Spring 的过滤器和拦截器

前言 我们在进行 Web 应用开发时&#xff0c;时常需要对请求进行拦截或处理&#xff0c;故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢&#xff1f;本文将详细讲解两者的区别和对应的使用场景。 &#xff08;本文的代码实现首先是基于 Sprin…...

请介绍下H264的多参考帧技术及其应用场景,并请说明下为什么要有多参考帧?

H.264&#xff08;也称为H.264/AVC&#xff09;的多参考帧机制是其编码效率和质量提升的关键部分。这个机制允许编码器在编码当前帧时&#xff0c;参考多个之前已编码的帧。这种多参考帧的方法为编码器提供了更多的选择&#xff0c;使其能够更准确地预测当前帧的内容&#xff0…...

第6章 Elasticsearch,分布式搜索引擎【仿牛客网社区论坛项目】

第6章 Elasticsearch&#xff0c;分布式搜索引擎【仿牛客网社区论坛项目】 前言推荐项目总结第6章 Elasticsearch&#xff0c;分布式搜索引擎1.Elasticsearch入门2.Spring整合ElasticsearchDiscussPostRepositoryDiscussPostControllerEventConsumer 3.开发社区搜索功能 最后 前…...

odoo 全局调整list_controller中默认方法(form_controller和kanban_controller等亦可以同样操作)

需求说明 工作中遇到需要调整odoo原生的tree hearder button显示逻辑&#xff0c;又不可以直接跳转odoo源码&#xff0c;故新加个js全局替换对应的方法&#xff0c;以实现对应功能的同时不影响后期odoo版本升级。 odoo 全局调整list_controller方法示例 创建一个js放到stati…...

大模型日报2024-05-13

大模型日报 2024-05-13 大模型资讯 谷歌推出Gemini生成式AI平台 摘要: 生成式人工智能正在改变我们与技术的互动方式。谷歌最近推出了名为Gemini的新平台&#xff0c;该平台代表了其在生成式AI领域的最新进展。Gemini平台集成了一系列先进的工具和功能&#xff0c;旨在为用户提…...

【使用Condition来模拟生产消费】

使用Condition来模拟生产消费 1. 关于ReentrantLock 和condition的认知?2.使用condition实现生产者-消费者1. 关于ReentrantLock 和condition的认知? /*Q: ReentrantLock是如何实现管理锁和线程的?A: ReentrantLock是并发包中 一个类,它实现了Lock接口,提供了比内置synch…...

5.14学习总结

java聊天室项目 分片上传 将大文件切分为多个小的数据块&#xff08;通常大小为1MB~10MB&#xff09;&#xff0c;然后将这些小数据块分别上传至服务器&#xff0c;最后由服务器将这些小块组合成完整的文件。这种方式可以避免由于网络中断或超时而导致上传失败&#xff0c;并…...

最新极空间部署iCloudpd教程,实现自动同步iCloud照片到NAS硬盘

【iPhone福利】最新极空间部署iCloudpd教程&#xff0c;实现自动同步iCloud照片到NAS硬盘 哈喽小伙伴们好&#xff0c;我是Stark-C~ 我记得我前年的时候发过一篇群晖使用Docker部署iCloudpd容器来实现自动同步iCloud照片的教程&#xff0c;当时热度还很高&#xff0c;可见大家…...

Sketch总结

sketch禁用了lineGap https://www.sketch.com/docs/designing/text/ http://www.sketchcn.com/sketch-chinese-user-manual.html https://github.com/sketch-hq/sketch-document https://developer.sketch.com/file-format/ https://animaapp.github.io/sketch-web-viewer/ htt…...

【iOS】工厂模式

文章目录 前言设计模式的三大原则简单工厂模式工厂方法模式抽象工厂模式关于三兄弟的升级与降级注意 前言 上文讲完了iOS的架构模式&#xff0c;接下来聊一聊设计模式&#xff0c;设计模式有许多&#xff0c;主要介绍一下工厂模式 设计模式的三大原则 S 单一职责原则 告诉我…...

目标检测算法YOLOv6简介

YOLOv6由Chuyi Li等人于2022年提出&#xff0c;论文名为&#xff1a;《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2209.02976 &#xff0c;项目网页&#xff1a;https://github.c…...

如何修复显示器或笔记本电脑屏幕的黄色色调?这里提供几种方法

序言 如果你的笔记本电脑屏幕呈淡黄色,则可以启用夜灯功能。该问题也可能源于连接松散的显示电缆、损坏的显卡驱动程序或错误配置的显示器设置。以下是一些故障排除步骤,你可以尝试解决此问题。 禁用夜间模式 夜间模式功能旨在减少显示器的蓝色色调,使屏幕看起来更温暖,…...

5.14 力扣每日一题 贪心

2244. 完成所有任务需要的最少轮数 class Solution { public:int minimumRounds(vector<int>& tasks) {int ntasks.size(),sum0;sort(tasks.begin(),tasks.end()); //排序就不用哈希表int a;for(int i0;i<n;){int ct0;atasks[i];while(i<n&&tasks[i]a…...

wordpress 访问文章内容页 notfound

解决&#xff1a; 程序对应的伪静态规则文件.htaccess是空的 网站根目录下要有 .htaccess 文件&#xff0c;然后将下面的代码复制进去。 <ifmodule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRule ^index\.php$ - [L]RewriteCond %{REQUEST_FILENAME} !-fRew…...

【Python探索之旅】列表

目录 特点 入门 访问元素 新增元素 修改元素 插入元素 删除元素 完结撒花 前言 在Python中&#xff0c;列表(List)是最常用的数据结构之一&#xff0c;类似于其他语言&#xff0c;如Java&#xff0c;与其不同啊Python中不需要声明数据类型。它提供了一种灵活且高效的方式…...

搜维尔科技:深入探讨Varjo XR头显在汽车行业的可能性

搜维尔科技&#xff1a;深入探讨Varjo XR头显在汽车行业的可能性 搜维尔科技&#xff1a;深入探讨Varjo XR头显在汽车行业的可能性...

YOLOv8预测流程-原理解析[目标检测理论篇]

接下来是我最想要分享的内容&#xff0c;梳理了YOLOv8预测的整个流程&#xff0c;以及训练的整个流程。 关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了&#xff0c;为了更好地介绍本章内容&#xff0c;还是把YOLOv8网络结构图放在这里&#xff0c;方便查看。 1.前言…...

TCP超时重传机制

一、TCP超时重传机制简介 TCP超时重传机制是指当发送端发送数据后&#xff0c;如果在一定时间内未收到接收端的确认应答&#xff0c;则会认为数据丢失或损坏&#xff0c;从而触发重传机制。发送端会重新发送数据&#xff0c;并等待确认应答。如果在多次重传后仍未收到确认应答&…...

Oracle 的 RMAN(Recovery Manager) 和 DM(达梦数据库)的 DMRman异同

Oracle 的 RMAN&#xff08;Recovery Manager&#xff09; 和 DM&#xff08;达梦数据库&#xff09;的 DMRman异同 Oracle 的 RMAN&#xff08;Recovery Manager&#xff09; 和 DM&#xff08;达梦数据库&#xff09;的 DMRman 是两个分别用于不同数据库系统的备份和恢复工具…...

HVV面试题2024护网蓝队面试题

一. 目前有防火墙&#xff0c;全流量检测&#xff0c;态势感知&#xff0c;IDS&#xff0c;waf&#xff0c;web服务器等设备&#xff0c;如何搭建一个安全的内网环境&#xff0c;请给出大概拓扑结构 &#xff08;适用于中高级&#xff09; 搭建安全内网环境拓扑结构&#xff1…...

2026年AI趋势监控平台主流方案解析与场景选型

核心观点摘要 AI趋势监控平台正由被动告警向预测与策略推演演进&#xff0c;实时性与可解释性成为2026年选型首要指标&#xff0c;融合多模态感知与业务知识图谱的方案更具竞争力。选型需综合考量数据接入广度、模型推理时效、行业场景适配度与总体拥有成本&#xff0c;单一性能…...

macOS 环境安装 Miniconda3 完全指南

macOS 环境安装 Miniconda3 完全指南&#x1f4a1; 摘要: 本文深入讲解了在 macOS 系统上安装 Miniconda3 的完整流程&#xff0c;涵盖环境准备、下载安装、配置优化、虚拟环境管理、常见问题解决等核心内容。结合腾讯地图 Map Skills 开发场景&#xff0c;提供 Python 环境最佳…...

利用快马平台快速生成ffmpeg视频裁剪与滤镜添加原型

最近在做一个短视频处理的小工具&#xff0c;需要快速验证ffmpeg的视频裁剪和滤镜功能。传统方式要自己搭建环境、查文档、写代码&#xff0c;整个过程特别耗时。后来发现用InsCode(快马)平台可以省去这些麻烦&#xff0c;直接输入需求就能生成可运行的原型代码&#xff0c;特别…...

5大场景落地指南:企业级语音识别服务从部署到优化全攻略

5大场景落地指南&#xff1a;企业级语音识别服务从部署到优化全攻略 【免费下载链接】whisper-asr-webservice OpenAI Whisper ASR Webservice API 项目地址: https://gitcode.com/gh_mirrors/wh/whisper-asr-webservice 【项目核心价值定位】解决3大语音识别痛点的开源…...

CLIP ViT-H-14效果展示:艺术风格迁移前后图像在特征空间的距离变化

CLIP ViT-H-14效果展示&#xff1a;艺术风格迁移前后图像在特征空间的距离变化 你有没有想过&#xff0c;当一幅梵高的《星空》被AI“理解”成毕加索的立体派风格时&#xff0c;在AI的“大脑”里&#xff0c;这两幅画到底有多“像”&#xff1f; 今天&#xff0c;我们就来用C…...

暗黑破坏神2存档编辑器:5分钟解决20年存档管理难题的终极免费方案

暗黑破坏神2存档编辑器&#xff1a;5分钟解决20年存档管理难题的终极免费方案 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾在《暗黑破坏神2》中花费数百小时培养角色&#xff0c;却因存档损坏而前功尽弃&#xff1f;…...

像素语言·维度裂变器效果展示:看AI如何把普通句子变高级

像素语言维度裂变器效果展示&#xff1a;看AI如何把普通句子变高级 1. 引言&#xff1a;当文字遇见像素魔法 在数字创作的世界里&#xff0c;文字是最基础的"像素"。但如何让这些文字像素焕发出更绚丽的光彩&#xff1f;像素语言维度裂变器(Pixel Dimension Fissio…...

3大维度解析Source Han Serif CN如何重塑中文字体应用生态

3大维度解析Source Han Serif CN如何重塑中文字体应用生态 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 价值解析&#xff1a;从商业、技术、设计维度重新定义开源字体价值 商业价值…...

重构暗黑3操作逻辑:D3KeyHelper颠覆式辅助工具的三阶价值验证

重构暗黑3操作逻辑&#xff1a;D3KeyHelper颠覆式辅助工具的三阶价值验证 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 在快节奏的暗黑破坏神3战斗…...

RexUniNLU新手必看:从模型下载到API服务部署完整流程

RexUniNLU新手必看&#xff1a;从模型下载到API服务部署完整流程 1. 引言&#xff1a;为什么选择RexUniNLU&#xff1f; RexUniNLU是一款基于Siamese-UIE架构的轻量级自然语言理解框架&#xff0c;它最大的特点是支持零样本学习——这意味着你不需要准备任何标注数据&#xf…...