SpringBoot拦截器和过滤器详解及使用

在现代Web应用程序开发中,尤其是在使用SpringBoot框架构建项目时,理解并有效利用拦截器(Interceptor)和过滤器(Filter)对于增强应用程序的功能性、安全性和可维护性至关重要。


拦截器和过滤器作为控制请求处理流程中的重要组件,它们在不同的层级上对进入和离开应用程序的请求进行预处理和后处理操作。 

SpringBoot拦截器(Interceptor)

概念与作用: SpringBoot拦截器是基于Java的面向切面编程(AOP)思想实现的,它允许开发者在业务处理过程中的特定点插入额外的处理逻辑,而不必修改核心业务代码。

拦截器主要用于处理业务逻辑相关的拦截需求,例如权限验证、日志记录、事务管理等。

拦截器通常在Spring MVC的DispatcherServlet内部工作,因此它只对Spring MVC处理的请求生效,不适用于静态资源。

代码实现示例:

创建一个简单的拦截器类:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class LoggingInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Before the request is handled: " + request.getRequestURI());return true; // 返回true表示继续处理请求,false表示中断请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("After the request is handled, before rendering view.");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Request completed. Cleaning up resources if any.");}
}

在配置类中注册拦截器:

import org.springframework.beans.factory.annotation.Autowired;
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 {@Autowiredprivate LoggingInterceptor loggingInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loggingInterceptor).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns("/excludePath"); // 排除某些路径}
}

SpringBoot过滤器(Filter)

概念与作用: 过滤器是Servlet规范的一部分,它可以对进入应用的所有HTTP请求和响应进行预处理和后处理操作,无论这些请求是否由Spring MVC处理。

过滤器常用于处理跨域请求、字符编码转换、安全验证等通用任务。

代码实现示例:

创建一个简单的过滤器类:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class CharacterEncodingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化操作}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;System.out.println("Filtering request to " + httpRequest.getRequestURI());request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");chain.doFilter(request, response); // 继续执行下一个过滤器或请求处理器}@Overridepublic void destroy() {// 清理资源}
}

在SpringBoot应用中注册过滤器,可以通过实现WebMvcConfigurer接口或直接使用@Component@Order注解(需要Spring Boot 2.4+版本):

// 使用WebMvcConfigurer接口注册
@Configuration
public class FilterConfig implements WebMvcConfigurer {@Autowiredprivate CharacterEncodingFilter characterEncodingFilter;@Overridepublic void addFilters(FilterRegistrationBean<Filter> registry) {registry.addFilter(characterEncodingFilter, "/*").addInitParameter("paramName", "paramValue").setOrder(1); // 设置执行顺序}
}// 或者使用@Component和@Order(Spring Boot 2.4+)
@Component
@Order(1)
public class CharacterEncodingFilter extends OncePerRequestFilter { /* ... */ }

区别总结:

  1. 触发时机:过滤器先于拦截器执行,过滤器在请求进入Servlet之前和响应返回给客户端之前工作;拦截器则在Spring MVC的请求处理流程中,更靠近业务逻辑层。

  2. 依赖性:过滤器依赖于Servlet容器,是Servlet规范的一部分;拦截器是Spring框架特有的,不依赖于Servlet容器。

  3. 功能范围:过滤器可以对所有进出Web应用的数据流进行操作,包括静态资源;拦截器主要针对Spring MVC的请求处理流程,通常不处理静态资源。

  4. 实现方式:过滤器基于函数回调机制;拦截器通常基于Java的反射机制(动态代理)实现。

  5. 资源访问:拦截器可以访问Spring的IOC容器,可以直接使用Spring管理的Bean;而过滤器则不行,除非手动实现Spring的依赖注入。

通过以上对比和代码示例,可以看出拦截器和过滤器在SpringBoot应用中各有侧重点和适用场景,选择使用哪种机制取决于具体的业务需求。

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

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

相关文章

【Spark】从DataFrame的schema创建表

// 基于DataFrame创建表 def createTable(dataFrame: DataFrame,partitionColumns: Array[String],databaseName: String,tableName: String): Unit = {

怎么在stm32上跑自己的神经网络

此教程为目前全网为数不多用于使用STM32实时跑神经网络结果输出的教程&#xff0c;不涉及原理讲解&#xff0c;只为帮助想在stm32上使用神经网络的朋友 基本步骤为先跑出神经网络得到xxx.h5文件&#xff0c;然后用cubemx把h5文件移植到stm32中&#xff0c;然后初始化设置输入输…

.NET 使用Automapper映射 Record类型

前言 当使用Automapper进行对象映射时,通常我们会使用POCO(Plain Old CLR Object)类作为源对象和目标对象。然而,自从C# 9引入了record类型,它们提供了更简洁、不可变的对象模型。 我已经将项目的所有Dto都是用record类型,但是record类型还是有些需要注意的点,本文将介…

C语言.数据结构.单链表经典算法

数据结构.单链表经典算法 1.经典算法OJ题1&#xff1a;移除链表元素1.1题目描述&#xff1a;1.2题解&#xff1a;1.3图文解释&#xff1a; 2.经典算法OJ题2&#xff1a;反转链表2.1题目描述&#xff1a;2.2题解&#xff1a;2.3图文解释 3.经典算法OJ题3&#xff1a;合并两个有序…

编译和运行qemu-uboot-arm64单板的Armbian系统

这篇文章ARM虚拟机安装OMV-CSDN博客遗留一个启动qemu-uboot-arm64单板Armbian镜像的问题&#xff0c;使用官方下载的镜像&#xff0c;会报错&#xff1a; fatal: no kernel available .... Failed to load /vmlinuz ...... qemu-system-aarch64 -smp 8 -m 8G -machine virt …

代码随想录算法训练营第20天|二叉树

654. 最大二叉树 思路和由中后序列构建树的思路是一样的&#xff0c;只不过这里不是通过后序的最后一个数来进行分割&#xff0c;而是通过找最大值进行分割左右子树 迭代找出左子树和右子树的的边界&#xff0c;返回当前节点就行了 具体代码后续补 617. 合并二叉树 这里的retu…

WPF音乐播放器 零基础4个小时左右

前言&#xff1a;winfrom转wpf用久的熟手说得最多的是,转回去做winfrom难。。当时不明白。。做一个就知道了。 WPF音乐播放器 入口主程序 FontFamily"Microsoft YaHei" FontSize"12" FontWeight"ExtraLight" 居中显示WindowStartupLocation&quo…

数据结构:并查集

数据结构&#xff1a;并查集 题目描述参考代码 题目描述 输入样例 5 5 C 1 2 Q1 1 2 Q2 1 C 2 5 Q2 5输出样例 Yes 2 3参考代码 #include <iostream>using namespace std;const int N 100010;int n, m; int p[N], sz[N];int find(int x) // 返回x的祖宗节点 路径…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十六)- 微服务(6)

目录 10. Docker 10.1 Docker基本操作 10.1.1 镜像相关命令 10.1.2 容器相关命令 10.2 数据卷命令 10.2.1 常用命令 : 10.2.2 挂载数据卷 10. Docker 10.1 Docker基本操作 10.1.1 镜像相关命令 docker --help 查看docker帮助文档 docker images --help 查看docker ima…

Java中条件运算符的嵌套使用技巧总结

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

c语言项目-贪吃蛇项目2-游戏的设计与分析

文章目录 前言游戏的设计与分析地图&#xff1a;这里简述一下c语言的国际化特性相关的知识<locale.h> 本地化头文件类项setlocale函数 上面我们讲到需要打印★&#xff0c;●&#xff0c;□三个宽字符找到这三个字符打印的方式有两种&#xff1a; 控制台屏幕的长宽特性&a…

C++笔试强训day38

目录 1.天使果冻 2.dd爱旋转 3.小红取数 1.天使果冻 链接https://ac.nowcoder.com/acm/problem/219641 一开始都可以想到将数组的前x个数拿出来排降序输出第二个数即可。 但是因为询问量和数据量都较大&#xff0c;每次询问一次都要排序一次数组&#xff0c;会超时&#xf…

ai聊天机器人app的分享!有4个热门的软件!

在科技日新月异的今天&#xff0c;AI聊天机器人已经不再是遥不可及的科幻概念&#xff0c;而是实实在在走进了我们的日常生活。无论是工作中的信息查询&#xff0c;还是生活中的闲聊解闷&#xff0c;这些智能助手都能为我们提供便捷、高效的服务。那么&#xff0c;市面上都有哪…

含有嘧啶的光活性阳离子共轭微孔聚合物通过“吸附杀死”抗菌策略促进感染伤口愈合

引用信息&#xff1a; 文 章&#xff1a;Photoactive cationic conjugated microporous polymers containing pyrimidine with an adsorption-killantibacterial strategy for infected wound healing. 期 刊&#xff1a;Chemical Engineering Journal&#xff08;影响因子…

【MySQL】sql语句之库操作

序言 在上篇文章学习当中&#xff0c;我们认识了数据库的相关概念&#xff0c;以及MySQL的框架和基本使用等内容&#xff0c;总之对数据库有了一个大致的认识&#xff0c;那么本篇文章将开始关于sql语句的学习&#xff0c;本文主要是关于库的属性和操作的内容&#xff0c;简单可…

stm32下载驱动ST-LINK/V2驱动下载

http://www.openedv.com/docs/tool/dap/ST-LINKV2.html https://www.stmcu.com.cn/Designresource/detail/fi rmware_software/709492

电商风控指南:“仅退款”成部分商家梦魇,如何有效防控非法牟利

目录 “仅退款”成不法分子牟利新途径 各电商平台的“仅退款”条款模糊 商家如何防范“仅退款”的欺诈 “仅退款”服务已成为各大电商平台的“标配”。然而&#xff0c;以“薅羊毛”的方式谋取不当利益&#xff0c;给商家造成了经济和声誉上的双重损失&#xff0c;引发了广泛关…

回溯之分割回文串

题目&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1a;[["a","a","b"],[&quo…

清除Ubuntu系统中的无法启动的Ubuntu 24实例

如果你的Ubuntu系统中有一个无法启动的Ubuntu 24实例&#xff0c;并且你想要清除这个实例&#xff0c;你可以按照以下步骤操作&#xff1a; &#xff08;1&#xff09;备份重要数据: 在进行任何此类操作之前&#xff0c;请确保备份了所有重要数据&#xff0c;以防万一出现问题。…

CentOS-内网搭建FTP-Server

一、镜像选择 1、 Centos-everting或者DVD 2、7.5 7.6 7.9 均可 二、安装步骤 1、其余步骤和普通安装一致。 2、最重要的一步为“软件选择” 1、勾选FTP、文件以及存储服务器、性能以及开发工具。 三、FTPServer搭建 1、关闭防火墙 systemctl stop firewalld or 通过21和20…