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

server/2025/1/19 23:44:06/

拦截器

在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实现):

java">@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接口提供了许多默认实现的方法,可以按需覆盖。

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

java">@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. 拦截所有路径

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

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

2. 拦截特定路径

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

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

3. 排除某些路径

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

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

4. 拦截多个路径

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

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

5. 使用通配符

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

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

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

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

6. 排除静态资源路径

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

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

7. 排除特定请求方法

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

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

8. 拦截特定请求方法

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

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

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

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

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

10. 条件性拦截

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

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

java">@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.ppmy.cn/server/159750.html

相关文章

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (四、最近上映电影滚动展示及加载更多的实现)

在HarmonyOS NEXT开发环境中,可以使用多种组件和库来构建丰富且交互友好的应用。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库,从零开始实现一个简单的影视APP的首页,主要关注最近上映电影的滚动展示及加载更多功能的实现。 开源项目…

【博客之星2024】技术洞察:前沿技术趋势与创新实践

前言 随着科技的飞速发展,技术的前沿趋势和跨领域的融合创新已经成为影响现代社会的重要因素。无论是 人工智能 (AI)、区块链 还是 量子计算,这些新兴技术不仅仅改变了行业的运行方式,还深入影响了社会、文化及个人的生活方式。因此&#xf…

Centos 离线安装杀毒软件

离线部署实现: 1、去官网下载对应的软件包,centos就下载 .rpm软件包。https://www.clamav.net/downloads2、将下载的软件包上传到服务器后使用rpm命令进行安装,软件包里面已经将相关依赖这些打包好了,直接安装就行。 rpm -ivh --…

【Leetcode 热题 100】45. 跳跃游戏 II

问题背景 给定一个长度为 n n n 的 0 0 0 索引 整数数组 n u m s nums nums。初始位置为 n u m s [ 0 ] nums[0] nums[0]。 每个元素 n u m s [ i ] nums[i] nums[i] 表示从索引 i i i 向前跳转的最大长度。换句话说,如果你在 n u m s [ i ] nums[i] nums[i…

Python大数据可视化:基于Python的王者荣耀战队的数据分析系统设计与实现_flask+hadoop+spider

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 比赛信息管理 看板展示 系统管理 摘要 本文使用Python与…

Node.js 完全教程:从入门到精通

Node.js 完全教程:从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

博客搭建 — GitHub Pages 部署

关于 GitHub Pages GitHub Pages 是一项静态站点托管服务&#xff0c;它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件&#xff0c;通过构建过程运行文件&#xff0c;然后发布网站。 本文最终效果是搭建出一个域名为 https://<user>.github.io 的网站 创建…

数据结构(初阶)(二)----顺序表

顺序表 顺序表概念与结构顺序表实现头文件创建与初始化尾插判断空间大小 头插尾删头删查找指定位置之前插入数据指定位置删除数据销毁&#xff08;回收&#xff09; 测试文件 概念与结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般采用…