【spring boot统一功能处理】拦截器

拦截器

在Spring Boot中,拦截器(Interceptor)是用于在处理请求前后进行一些自定义操作的组件,常用于日志记录、权限检查、性能监控等。拦截器的使用依赖于HandlerInterceptor接口和WebMvcConfigurer接口。

1. HandlerInterceptor接口

HandlerInterceptor接口是Spring MVC中用来定义拦截器的核心接口。它有三个方法需要实现:

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler): 这个方法在请求处理之前执行,返回true表示请求继续往下处理,返回false则请求被终止,后续的处理逻辑不会执行。

  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView): 这个方法在请求处理之后(视图渲染之前)执行。可以在此方法中修改ModelAndView,即控制器返回的模型和视图信息。

  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex): 这个方法在整个请求处理完毕后执行,通常用于清理资源等操作。无论请求成功与否都会执行。

示例代码(HandlerInterceptor实现):

@Component
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("请求前处理");return true; // 如果返回false,请求将被拦截}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("请求后处理");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("请求完成处理");}
}

2. WebMvcConfigurer接口

WebMvcConfigurer接口是Spring MVC的配置接口,允许我们定制Spring MVC的配置。通过实现该接口并重写其中的方法,我们可以注册拦截器、配置视图解析器、设置静态资源等。

如何注册拦截器:

要在Spring Boot中注册拦截器,需要实现WebMvcConfigurer接口,并在addInterceptors()方法中注册自定义拦截器。WebMvcConfigurer接口提供了许多默认实现的方法,可以按需覆盖。

示例代码(注册拦截器):

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/**") // 拦截所有路径.excludePathPatterns("/login", "/public/**"); // 排除某些路径}
}

在这个例子中,WebConfig类实现了WebMvcConfigurer接口,并在addInterceptors方法中注册了MyInterceptor拦截器。addPathPatterns方法用来配置哪些路径会被拦截,excludePathPatterns方法用来配置哪些路径不会被拦截。

小结:

  • HandlerInterceptor用于定义具体的拦截器,提供了请求前、请求后、请求完成后的处理方法。
  • WebMvcConfigurer用于定制Spring MVC的配置,包括注册拦截器。通过实现addInterceptors方法可以将拦截器添加到Spring MVC的拦截链中。

这种机制为应用程序提供了灵活的请求拦截能力,可以非常方便地在请求流程中添加自定义逻辑。

在Spring Boot应用中,拦截器的路径设置是非常常见的需求,通常会通过addPathPatternsexcludePathPatterns方法来进行配置。以下是一些常见的拦截路径设置方式,可以根据不同的场景需求来选择合适的方式。

拦截路径设置

1. 拦截所有路径

如果你希望拦截应用中的所有请求路径,可以使用/**,这表示拦截所有路径。

registry.addInterceptor(myInterceptor).addPathPatterns("/**");  // 拦截所有路径

2. 拦截特定路径

有时你只想拦截某些特定的路径,可以使用精确路径或通配符。例如,拦截以/admin开头的所有请求:

registry.addInterceptor(myInterceptor).addPathPatterns("/admin/**");  // 拦截所有以/admin开头的路径

3. 排除某些路径

你可以通过excludePathPatterns方法排除某些特定路径的请求不被拦截。例如,排除对/login/public/**路径的拦截:

registry.addInterceptor(myInterceptor).addPathPatterns("/**")  // 拦截所有路径.excludePathPatterns("/login", "/public/**");  // 排除/login和/public/**路径

4. 拦截多个路径

你可以同时拦截多个不连续的路径。例如,拦截/user/**/order/**路径:

registry.addInterceptor(myInterceptor).addPathPatterns("/user/**", "/order/**");  // 拦截/user和/order下的所有路径

5. 使用通配符

Spring MVC支持使用通配符来匹配路径,常见的有:

  • *:匹配单个路径元素(如/user/*匹配/user/123
  • **:匹配多个路径元素(如/admin/**匹配/admin/xxx/yyy
  • ?:匹配单个字符(如/user/?匹配/user/1

例如,拦截以/api/开头且后面跟着两个路径段的请求:

registry.addInterceptor(myInterceptor).addPathPatterns("/api/*/*");  // 匹配/api/xxx/yyy形式的路径

6. 排除静态资源路径

通常,我们会排除静态资源路径(如CSS、JS、图片等)不被拦截。假设静态资源存放在/static/**路径下:

registry.addInterceptor(myInterceptor).addPathPatterns("/**")  // 拦截所有路径.excludePathPatterns("/static/**");  // 排除静态资源路径

7. 排除特定请求方法

拦截器可以不仅仅根据路径进行设置,还可以结合HTTP请求方法来排除。例如,排除GET请求不被拦截:

registry.addInterceptor(myInterceptor).addPathPatterns("/**")  // 拦截所有路径.excludePathPatterns(HttpMethod.GET, "/login");  // 排除GET方法的请求

8. 拦截特定请求方法

通过addPathPatterns方法,你还可以拦截特定的HTTP请求方法,例如只拦截POST请求:

registry.addInterceptor(myInterceptor).addPathPatterns("/submit/**")  // 拦截/submit路径下的所有请求.excludePathPatterns(HttpMethod.GET, "/submit/**");  // 排除GET请求

9. 排除某些用户或角色的路径

有时你需要根据用户角色或者登录状态来决定是否拦截某个路径。例如,只有登录用户才能访问/user/**路径:

registry.addInterceptor(myInterceptor).addPathPatterns("/user/**")  // 拦截/user/**路径.excludePathPatterns("/login", "/signup");  // 排除/login和/signup路径

10. 条件性拦截

如果你的拦截器需要根据某些动态条件(如请求头、参数等)来决定是否拦截请求,你可以在preHandle方法中进行检查。

例如,拦截包含特定请求头的请求:

@Component
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("Authorization");if (token != null && token.startsWith("Bearer ")) {return true; // 允许请求继续}response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");return false;  // 拦截请求}
}

总结

Spring Boot中拦截路径的设置灵活多样,你可以通过精确的路径、通配符、HTTP请求方法等多种方式配置拦截规则。常见的设置有:

  • 拦截所有路径或特定路径
  • 排除某些路径
  • 配合HTTP请求方法进行拦截
  • 根据用户或其他条件动态控制是否拦截请求

通过合理地配置拦截器的路径,可以满足各种业务需求,比如权限控制、请求日志记录等。

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

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

相关文章

qt自定义加载字体库ttf

在开发过程中,我们会用到其他的开源字体库,然而在打包后会在不同的电脑上遇到没有安装该字体的问题,以下是通过代码在main.cpp中添加字体示例,以供参考: int main(int argc, char *argv[]) {QApplication app(argc, a…

骑砍2霸主MOD开发(11)-可编程渲染管线Shader编程

一.固定渲染管线&可编程渲染管线 固定渲染管线:GPU常规渲染算法,将3D模型经过四大变换计算得到2D屏幕图像 可编程渲染管线:定制化GPU渲染算法,需要提交Shader至GPU中,GPU根据定制化算法得到2D屏幕图像 二.CoreShader&TerrainShader CoreShader:游戏中使用的静态shader…

w163美食推荐商城

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

计算机网络 (47)应用进程跨越网络的通信

前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程,它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信,本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信,需要借助网络协议栈中的各层协议&#x…

Mysql--实战篇--大数据量表的分页优化(自增长主键,子查询主键主查询全部,查询条件加索引,覆盖索引等)

当Mysql数据表存储大量数据时(百万级别数据),分页查询的性能问题是一个常见的挑战。特别是当使用LIMIT和OFFSET时,随着OFFSET的增加,查询性能会显著下降。原因在于MySQL需要扫描并跳过前面的行,这会导致I/O…

【Linux】Mysql部署步骤

一、JDK安装配置 在home目录下执行命令:mkdir Jdk 1.将JDK 上传至该文件夹,有些终端工具可以直接上传文件,比如:MobaXterm 可以看到安装包已经上传上来了 2.直接安装 命令:rpm -ivh jdk-8u311-linux-x64.rpm 3.安装成…

【0391】Postgres内核 checkpointer process ① 启动初始化

相关文章: 【0108】checkpointer运行原理(概念篇)(1) 【0278】checkpointer 共享内存(CheckpointerShmem)初始化(3) 文章目录 1. 启动 checkpointer process1.1 初始化 checkpointer PID1.2 注册 signal1.3 初始化 last checkpoint time2. 确认 config 的 shared memo…

归子莫的科技周刊#2:白天搬砖,夜里读诗

归子莫的科技周刊#2:白天搬砖,夜里读诗 本周刊开源,欢迎投稿。 刊期:2025.1.5 - 2025.1.11。原文地址。 封面图 下班在深圳看到的夕阳,能遇到是一种偶然的机会,能拍下更是一种幸运。 白天搬砖,…

你需要什么样的资源隔离?丨TiDB 资源隔离最佳实践

导读 资源隔离是数据库性能优化的重要环节, TiDB 在当前版本已经实现了从数据级隔离到流控隔离的全面升级 ,无论是多系统共享集群、复杂负载隔离,还是小型系统整合和 SQL 精细化控制,TiDB 都提供了灵活且高效的解决方案。 本文以…

w162体育馆管理系统

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

Java中对list数据进行手动分页(可直接复用版)

1.获取list列表数据 // 这边用的mybatisplus查询的sql。条件自己组装 List<实体类> result baseMapper.getPageData(lambdaQuery); 2.计算总记录数 // 计算总记录数 int totalRecords result.size(); 3.创建分页对象&#xff0c;并塞入结果值 // 创建分页对象 IPa…

cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…

C# 并发和并行的区别--16

目录 并发和并行 一.并发 定义 特点 代码示例 代码解释 二.并行 定义 特点 在C#中的体现 代码示例 代码解释 三.并发和并行的区别 四 .如何在C#中选择并发还是并行 1.考虑任务类型 2.代码示例 3.注意事项 五.总结 并发和并行 在编程领域,并发和并行是两个密切…

Android SystemUI——车载CarSystemUI加载(八)

Android 系统早期的状态栏和导航栏对于手机设备来说那是相当重要的,但是随着手机版本的不断更新,状态栏和导航栏对于手机的重要性在逐渐降低,特别是在快捷手势出现之后,导航栏几乎变得可有可无。但是对于当前如火如荼的车载系统来说,状态栏和导航栏却几乎是必备的,谷歌自…

《零基础Go语言算法实战》【题目 4-3】请用 Go 语言编写一个验证栈序列是否为空的算法

《零基础Go语言算法实战》 【题目 4-3】请用 Go 语言编写一个验证栈序列是否为空的算法 给定两个具有不同值的 push 和 pop 数组序列&#xff0c;当且仅当这可能是对最初为空的栈的一系 列 push 和 pop 操作的结果时才返回 true。 【解答】 ① 思路。 这是考查栈操作的题…

网络学习记录5

二、学习网络知识&#xff1a; 1、透传&#xff1a; ①“透传”指的是数据在传输过程中不被交换机或其他网络设备解析、修改或处理&#xff0c;而是直接从一个端口传输到另一个端口。这种传输方式保持了数据的原始性和完整性&#xff0c;常用于需要高速、低延迟的数据传输场景…

浅谈云计算14 | 云存储技术

云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…

vscode项目依赖问题

必读 一定要将前端下拉的项目备份一下&#xff0c;很容易运行导致依赖报错&#xff0c;重新下载 命令 使用幽灵分解器安装 pnpm install 替代 npm install 设置淘宝NPM镜像源 yarn config set registry https://registry.npmmirror.com 查看目前依赖包的版本 npm list ant-d…

服务器数据恢复—EMC存储POOL中数据卷被删除的数据恢复案例

服务器数据恢复环境&故障&#xff1a; EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘&#xff08;520字节&#xff09;。21块盘组建了2组RAID6&#xff1a;一组有11块硬盘&#xff0c;一组有10块硬盘。 在存储运行过程中&#xff0c;管理员误操作删除了 2组…

【LLM】25.1.15 arxiv更新37篇

—第1篇---- Consistency of Responses and Continuations Generated by Large Language Models on Social Media &#x1f50d; 关键词: Large Language Models, emotional consistency, semantic coherence, social media, Gemma, Llama 链接1 摘要: 本文研究了大型语言模…