【springboot】拦截器和过滤器的区别

【springboot】拦截器和过滤器的区别

  • 【一】区别
  • 【二】适用场景
    • 【1】过滤器
    • 【2】拦截器
  • 【三】使用案例
    • 【1】过滤器使用案例
    • 【2】拦截器使用案例

在 Spring Boot 中,拦截器(Interceptor)和过滤器(Filter)都是用于对请求进行预处理和后处理的机制,但它们存在一些区别,适用于不同的场景。下面将详细介绍它们的区别、适用场景,并给出使用案例。

【一】区别

(1)所属规范
过滤器:过滤器是 Servlet 规范中的一部分,是 Java EE 标准的一部分,依赖于 Servlet 容器。在 Spring Boot 项目中,只要引入了 Servlet 相关依赖,就可以使用过滤器。
拦截器:拦截器是 Spring 框架中的一部分,是 Spring MVC 框架的组件,依赖于 Spring 框架的上下文。
(2)作用范围
过滤器:过滤器的作用范围更广,它可以对所有的请求进行拦截,包括静态资源请求。它是在请求进入 Servlet 容器后,但在进入 Servlet 之前进行处理
拦截器:拦截器主要作用于 Spring MVC 的请求处理流程,只能拦截 Spring MVC 控制器处理的请求,对静态资源请求不会进行拦截。它是在请求进入控制器之前、控制器处理请求之后以及视图渲染之前进行处理
(3)实现方式
过滤器:过滤器需要实现 javax.servlet.Filter 接口,并重写 init、doFilter 和 destroy 方法。
拦截器:拦截器需要实现 org.springframework.web.servlet.HandlerInterceptor 接口,并重写 preHandle、postHandle 和 afterCompletion 方法。
(4)访问对象
过滤器:过滤器可以访问 ServletRequest 和 ServletResponse 对象,但无法直接访问 Spring 容器中的 Bean。
拦截器:拦截器除了可以访问 ServletRequest 和 ServletResponse 对象外,还可以访问 Spring 容器中的 Bean,因为它是 Spring 框架的一部分。

【二】适用场景

【1】过滤器

请求预处理:如字符编码转换、请求参数过滤等。
日志记录:记录所有请求的基本信息,包括请求 URL、请求时间等。
权限验证:对所有请求进行统一的权限验证,如判断用户是否登录。

【2】拦截器

控制器方法增强:在控制器方法执行前后添加额外的逻辑,如记录方法执行时间、进行权限细粒度验证等。
事务管理:在控制器方法执行前后开启和提交事务。
视图渲染前处理:对模型数据进行处理或添加额外的属性。

【三】使用案例

【1】过滤器使用案例

步骤 1:创建过滤器类

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;// 使用 @WebFilter 注解指定过滤的 URL 模式
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化方法,在过滤器创建时调用System.out.println("MyFilter initialized");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 预处理逻辑System.out.println("Before request processing");// 放行请求chain.doFilter(request, response);// 后处理逻辑System.out.println("After request processing");}@Overridepublic void destroy() {// 销毁方法,在过滤器销毁时调用System.out.println("MyFilter destroyed");}
}

步骤 2:启用过滤器
在 Spring Boot 主类上添加 @ServletComponentScan 注解,以启用 @WebFilter 注解。
java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

【2】拦截器使用案例

步骤 1:创建拦截器类

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("Before controller method execution");// 返回 true 表示继续执行后续流程,返回 false 则中断请求return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// 在控制器方法执行后,视图渲染前调用System.out.println("After controller method execution, before view rendering");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// 在请求处理完成后调用,包括视图渲染完成System.out.println("Request processing completed");}
}

步骤 2:配置拦截器
创建一个配置类,实现 WebMvcConfigurer 接口,并重写 addInterceptors 方法来注册拦截器。

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 WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns("/static/**"); // 排除静态资源请求}
}

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

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

相关文章

蓝桥杯备考:模拟算法之字符串展开

P1098 [NOIP 2007 提高组] 字符串的展开 - 洛谷 | 计算机科学教育新生态 #include <iostream> #include <cctype> #include <algorithm> using namespace std; int p1,p2,p3; string s,ret; void add(char left,char right) {string tmp;for(char ch left1;…

FPGA学习篇——Verilog学习1

1 数电基础知识&#xff08;后续可能还会继续补充&#xff09; 1.1 逻辑电平 这张图比较重要以及陌生的应该是高阻态Z&#xff0c;他是一个未知值&#xff0c;不一定为高也不一定为低电平&#xff0c;X是只能高电平和低电平中二选一。 1.2 进制 进制有常见的二进制&#xff0…

虚幻基础17:动画蓝图

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 animation blueprint图表&#xff08;Graph&#xff09;&#xff1a; 编辑动画逻辑。变量&#xff08;Variables&#xff09;&#xff1a; 管理动画参数。函数&#xff08;Functions&#xff09;&#xff1a; 自定义…

java中的锁面试题

1、多线程中 synchronized 锁升级的原理是什么&#xff1f; synchronized 是JVM层面的锁&#xff0c;是 Java 关键字&#xff0c;通过 monitor 对象来完成&#xff0c;synchronized 的实现涉及到锁的升级&#xff0c;具体为无锁、偏向锁、自旋锁、重量级锁 synchronized 锁升级…

C++的 I/O 流

本文把复杂的基类和派生类的作用和关系捋出来&#xff0c;具体的接口请参考相关文档 C的 I/O 流相关的类&#xff0c;继承关系如下图所示 https://zh.cppreference.com/w/cpp/io I / O 的概念&#xff1a;内存和外设进行数据交互称为 I / O &#xff0c;例如&#xff1a;把数…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)

目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…

《Python预训练视觉和大语言模型》:从DeepSeek到大模型实战的全栈指南

就是当代AI工程师的日常&#xff1a;* - 砸钱买算力&#xff0c;却卡在分布式训练的“隐形坑”里&#xff1b; - 跟着论文复现模型&#xff0c;结果连1/10的性能都达不到&#xff1b; - 好不容易上线应用&#xff0c;却因伦理问题被用户投诉…… 当所有人都在教你怎么调用…

Ollama教程:轻松上手本地大语言模型部署

Ollama教程&#xff1a;轻松上手本地大语言模型部署 在大语言模型&#xff08;LLM&#xff09;飞速发展的今天&#xff0c;越来越多的开发者希望能够在本地部署和使用这些模型&#xff0c;以便更好地控制数据隐私和计算资源。Ollama作为一个开源工具&#xff0c;旨在简化大语言…

【Elasticsearch】date range聚合

好的&#xff0c;继续之前的示例&#xff1a; json ] } } } } 4.3 自定义键&#xff08;key&#xff09; 通过为每个范围指定一个唯一的键&#xff08;key&#xff09;&#xff0c;可以在结果中更方便地引用每个范围。这在使用keyed参数将结果以键值对形式返回时尤其有用。 j…

ElasticSearch 学习课程入门(二)

引子 前文已经介绍了ES的增删改查基本操作&#xff0c;接下来&#xff0c;我们学习下高级点的用法。OK&#xff0c;那就让我们开始吧。 一、ES高级操作 1、条件查询 &#xff08;1&#xff09;GET https://127.0.0.1:9200/shopping/_search?qcategory:小米 &#xff08;2&…

中国通信企业协会 通信网络安全服务能力评定 风险评估二级要求准则

通信网络安全服务能力评定要求是对通信网络安全服务单位的资格状况、经济实力、技术能力、服务队伍、服务过程能力等方面的具体衡量和评价。中国通信企业协会通信网络安全服务能力评定风险评估二级应达到风险评估服务一级能力要求的所有条款&#xff0c;并在以下方面增强或增加…

php反序列化含CTF实战

php反序列化 声明&#xff1a;本人只是在学习反序列化 因此这篇文章大量参考了https://blog.csdn.net/Hardworking666/article/details/122373938 这位的博客 感谢他的详细文章让我可以详细学习反序列化 大家想看更详细的可以直接参考他的文章!!! 什么是序列化和反序列化 序…

6.PPT:魏女士-高新技术企业政策【19】

目录 NO1234​ NO567 ​ NO1234 创建“PPT.pptx”考生文件夹Word素材文档&#xff1a;选中对应颜色的文字→选中对应的样式单击右键按下匹配对应文字&#xff1a;应用所有对应颜色的文字开始→创建新的幻灯片→从大纲&#xff1a;考生文件夹&#xff1a;Word素材重置 开始→版…

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)

理解Linux系统内进程信号的整个流程可分为&#xff1a; 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生&#xff0c;本文会讲解信号的保存和信号处理相关的概念和操作&#xff1a; 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…

学习日记250205

一.论文 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 二、计划&#xff1a; 理一下微调相关的文章 三. &#xff09;——&#xff08; 明天认真学习了&#xff0c;不能再打这么久的星露谷了&#xff01;&#xff01;&#xff0…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

SSM网上球鞋竞拍系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 js…

基于springboot河南省旅游管理系统

基于Spring Boot的河南省旅游管理系统是一种专为河南省旅游行业设计的信息管理系统&#xff0c;旨在整合和管理河南省的旅游资源信息&#xff0c;为游客提供准确、全面的旅游攻略和服务。以下是对该系统的详细介绍&#xff1a; 一、系统背景与意义 河南省作为中国的中部省份&…

探索 paraphrase-MiniLM-L6-v2 模型在自然语言处理中的应用

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;将文本数据转换为机器学习模型可以处理的格式是至关重要的。近年来&#xff0c;sentence-transformers 库因其在文本嵌入方面的卓越表现而受到广泛关注。本文将深入探讨 paraphrase-MiniLM-L6-v2 模型&#xff0c;这…

人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)

一、 前言&#xff1a; 其实早一个月我已经使用过deepseek&#xff0c;并且也在自己的机器上通过ollama部署过&#xff0c;但一直没有太多动力&#xff0c;现在感觉还是的记录一下&#xff0c;省的自己给忘掉了 本文只是简单记录一下ollamaopen-webuichatbox部署通过网盘分享…