SpringBoot 拦截器(Interceptor)详解

概念

在Spring Boot中,拦截器是一种用于处理HTTP请求的机制,主要用于执行一些预处理或后处理的逻辑。与AOP不同,拦截器更专注于HTTP请求的处理


拦截器接口

在Spring Boot中,拦截器需要实现HandlerInterceptor接口!!!

//这个接口定义了三个主要的方法
preHandle:在请求处理之前被调用,用于进行一些预处理操作
postHandle:在请求处理之后、视图渲染之前被调用,用于进行一些后处理操作
afterCompletion:在整个请求处理完成后被调用,用于进行一些资源清理操作

配置拦截器

//在Spring Boot中配置拦截器主要通过实现WebMvcConfigurer接口,并覆盖addInterceptors方法
//在上述例子中,MyInterceptor  是实现了HandlerInterceptor接口的拦截器类。通过addPathPatterns指定需要拦截的路径,通过excludePathPatterns指定排除的路径。
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**")  // 拦截的路径.excludePathPatterns("/public/**");  // 排除的路径}
}

 拦截器的实现

拦截器的实现类需要实现HandlerInterceptor接口,并覆盖其中的方法

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在请求处理之前执行的逻辑return true; // 返回true表示继续执行后续操作,返回false表示中断请求处理}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在请求处理之后执行的逻辑,视图渲染之前}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在整个请求处理完成后执行的逻辑,包括视图渲染之后}
}

使用场景

拦截器常用于

  • 身份验证
  • 权限控制
  • 日志记录
  • 统一异常处理
  • 请求参数处理

拦截器(Interceptor)和切面(AOP)之间的区别

拦截器

AOP

关注点

拦截器主要关注HTTP请求的处理,通常用于预处理、后处理、日志记录等与HTTP请求相关的操作,拦截器工作在Controller层之上,能够截取请求的生命周期

AOP关注点更加广泛,应用于方法调用、对象的创建、属性的获取等各个方面,AOP更灵活,可以在更细粒度的操作上进行横切关注点的处理

作用范围

拦截器主要作用于HTTP请求处理,对Controller层的处理有直接影响。拦截器的作用范围更集中

AOP可以作用于整个应用程序的多个模块,跨足多个层次。AOP的作用范围更广泛,不仅限于HTTP请求

使用场景

拦截器常用于身份验证、权限控制、日志记录等与HTTP请求生命周期相关的场景

AOP常用于横切关注点,如日志记录、性能监控、事务管理等,AOP更适合处理那些与业务逻辑解耦的横切关注点

实现方式

拦截器 在Spring Boot中通过实现HandlerInterceptor接口来创建拦截器

AOP在Spring中,可以通过配置切面和通知,使用@Aspect注解等方式实现AOP

粒度

拦截器作用于整个请求处理阶段,较为粗粒度

AOP可以根据需要选择切入点,可以是方法调用、对象的创建等,较为细粒度

依赖

拦截器主要依赖于Spring MVC框架,用于处理HTTP请求

AOP可以独立于任何框架使用,不仅限于Spring框架


AOP的功能性

  • 日志记录:可以通过AOP实现在方法调用前后记录日志
  • 事务管理:可以使用AOP确保一组操作在事务的上下文中执行
  • 性能监控: 可以通过AOP监控方法的执行时间等性能指标

拦截器(更适合权限控制)

  • 身份验证和授权: 拦截器可以用于对HTTP请求进行身份验证和授权,例如检查用户是否具有执行某个操作的权限
  • 请求预处理: 可以在拦截器中进行请求的预处理,例如解析请求参数、检查请求头等

拦截器(Interceptor)的实现

示例一

//在Spring Boot中,可以通过实现HandlerInterceptor接口来创建一个拦截器,用于判断请求是否携带了 token
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TokenInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 从请求头中获取 tokenString token = request.getHeader("Authorization");// 判断 token 是否存在if (token == null || token.isEmpty()) {// 如果不存在,返回未授权状态码,并终止请求response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}// 如果存在 token,继续处理请求return true;}
}
//在这个例子中,TokenInterceptor 继承了 HandlerInterceptorAdapter 类,重写了 preHandle 方法。
//在 preHandle 方法中,从请求头中获取了名为 "Authorization" 的 token,然后判断是否存在。
//如果不存在,返回未授权状态码(SC_UNAUTHORIZED)并终止请求;如果存在,继续处理请求

接下来,你需要在配置类中注册这个拦截器 

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 WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册拦截器,并设置拦截的路径registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/api/**"); // 设置需要拦截的路径}
}
//在这个例子中,WebMvcConfig 类实现了 WebMvcConfigurer 接口,并覆盖了 addInterceptors 方法,用于注册拦截器。
//在 addInterceptors 方法中,通过 registry.addInterceptor(new TokenInterceptor()) 注册了 TokenInterceptor 拦截器,并使用 .addPathPatterns("/api/**") 指定了需要拦截的路径,可以根据实际需求进行修改

 示例二

//我们再升级一下,需求是在请求前鉴权,如果没有携带 token 则返回 401,在请求后判断逻辑错误返回 500,并在请求完成后输出日志
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TokenInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 从请求头中获取 tokenString token = request.getHeader("Authorization");// 判断 token 是否存在if (token == null || token.isEmpty()) {// 如果不存在,返回未授权状态码并终止请求response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}// 在这里可以进行进一步的鉴权逻辑// 如果鉴权失败,可以返回 401 并终止请求// ...return true; // 鉴权通过,继续处理请求}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 请求处理完成后的逻辑if (ex != null) {// 如果有异常,返回 500 状态码response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);// 这里可以记录日志或进行其他逻辑处理System.err.println("Request completed with error: " + ex.getMessage());} else {// 请求正常完成,可以记录日志或进行其他逻辑处理System.out.println("Request completed successfully");}}
}
//在这个示例中,preHandle 方法用于在请求前进行鉴权,如果没有携带 token 则返回 401,如果鉴权失败可以在这里终止请求
//afterCompletion 方法用于在请求完成后进行逻辑处理,如果有异常则返回 500 并记录错误日志,否则记录请求正常完成的日志。请根据实际需求进行适当的调整。

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

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

相关文章

【突发】MDPI再出事!23本期刊84篇论文存在“审稿人工厂”问题,4本被中科院预警!

毕业推荐 SCIE: • 计算机类,6.5-7.0,JCR1区,中科院2区 • 2个月19天录用,6天见刊,36天检索 SCIE(CCF-C类) • 算法类,2.0-3.0,JCR3区,中科院…

python笔记_格式化输出

%操作符 %s字符串%d整数%.2f浮点数(显示小数点后两位) 定义 name Tom age 9 score 77.5 输出 print("猫咪信息:%s %d %.2f" % (name,age,score)) ——>猫咪信息:Tom 9 77.50 注意:%操作符指定的类型必…

后台与接口测试demo 查数据

pom 里引入 mybatis 依赖 2.添加 entity 实体类 3.添加 Mapper 添加SQL语句、接口 SpringbootApplicants.Java 添加 RestController接口 标识 SpringbootApplication 是一个接口,可以通过 GetMapping(“/”) 查询所有数据。 GetMapping(“/”) 依赖于 RestCon…

SpringCloud微服务-Eureka注册中心

Eureka注册中心 文章目录 Eureka注册中心前言1、Eureka的作用2、搭建EurekaServer3、服务注册4、启动多个实例5、服务拉取 -实现负载均衡 前言 在服务调用时产生的问题: //2. 利用RestTemplate发起HTTP请求,查询user String url "http://localho…

【力扣hot100】刷题笔记Day15

前言 今天要刷的是图论,还没学过,先看看《代码随想录》这部分的基础 深搜DFS理论基础 深搜三部曲 确认递归函数、参数确认终止条件处理目前搜索节点出发的路径 代码框架 void dfs(参数) {if (终止条件) {存放结果;return;}for (选择:本节点…

DVWA 靶场之 Command Injection(命令执行)middlehigh

对于 middle 难度的 我们直接先看源码 <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Set blacklist$substitutions array(&& > ,; > ,);// Remove any of the characters in the array (blacklist).$target str_rep…

通过一个栗子来看看创建和运行servlet

通过前面一篇文章的介绍&#xff08;搞着搞着对web project是不是有点迷糊&#xff1f;先关注几个问题-CSDN博客&#xff09;大家对于servlet作为中间层接收请求和反馈响应有了概念上的认知&#xff0c;接下来通过一个栗子来加深一下理解&#xff0c;还是基于前面的jsp项目&…

水电表远程集中抄表管理系统

水电表远程集中抄表管理系统是当前水电行业智能化发展的关键技术之一&#xff0c;为水电企业和用户提供了便捷、高效的抄表管理解决方案。该系统结合了远程监控、自动抄表、数据分析等多种功能&#xff0c;实现了水电抄表的智能化和精准化&#xff0c;为用户节省了大量人力物力…

LeetCode 42 接雨水--单调栈

LeetCode 42 接雨水 在算法和数据结构中&#xff0c;有一类问题被称为“接雨水”问题&#xff0c;它们通常涉及在给定的某种地形&#xff08;通常是表示为数组&#xff09;上模拟雨水下降后的积水情况。其中一个经典的接雨水问题就是给定一个柱状图&#xff0c;计算下雨之后能…

数据库学习案例20240227-数据库连接类故障-ORA-12547: TNS:lost contact

1 操作系统和数据库版本 cat /etc/redhat-release Red Hat Enterprise Linux Server release 6. (Santiago) SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise E…

智慧公厕让社区生活更美好

随着科技的迅猛发展&#xff0c;城市管理、城市服务均使用科技化的手段进行升级改造&#xff0c;社区生活更美好赋予全新的智慧效能&#xff0c;其中智慧公厕也成为了城市环卫设施的新宠。智慧公厕以物联网、互联网、大数据、云计算、5G通信、自动化控制等技术为核心&#xff0…

ConcurrentModificationException并发修改异常

ConcurrentModificationException并发修改异常 原因分析 可以通过遍历索引也可以通过迭代器进行遍历。在我们使用迭代器进行遍历集合的时候&#xff0c;会获取到当前集合的迭代对象。在里面有封装了迭代器的remove方法与集合自带的remove方法&#xff0c;如果我们调用迭代器对…

PowerShell执行策略:确保脚本安全执行的关键

PowerShell执行策略&#xff1a;确保脚本安全执行的关键 在自动化和脚本任务管理中&#xff0c;PowerShell 是 Windows 系统管理员和自动化工程师的强大工具。但随着这种强大的能力也带来了安全风险&#xff0c;特别是在执行未经验证的脚本时。为了降低这种风险&#xff0c;Po…

CI/CD:安装配置Gitlab Runner

CI/CD笔记.Gitlab系列 安装配置Gitlab Runner - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/136296840 Address …

浅谈 Linux fork 函数

文章目录 前言fork 基本概念代码演示示例1&#xff1a;体会 fork 函数返回值的作用示例2&#xff1a;创建多进程&#xff0c;加深对 fork 函数的理解 前言 本篇介绍 fork 函数。 fork 基本概念 pid_t fork(void) fork 的英文含义是"分叉"&#xff0c;在这里就是 …

UE4c++ ConvertActorsToStaticMesh

UE4c ConvertActorsToStaticMesh ConvertActorsToStaticMesh UE4c ConvertActorsToStaticMesh创建Edior模块&#xff08;最好是放Editor模块毕竟是编辑器代码&#xff09;创建UBlueprintFunctionLibraryUTestFunctionLibrary.hUTestFunctionLibrary.cpp:.Build.cs 目标:为了大量…

oracle 如何使用脚本实现访问控制(无需额外插件)

随着这些年勒索病毒的爆发,各个企业对数据安全的要求越来越高,常见的办法有开启数据库审计,加数据库防火墙,网络限制等等;但是细粒度审计会消耗大量系统资源,第三方数据库防火墙一般是需要收费的;这里介绍我个人常用的四个db级别trigger,用于记录部分关键信息可以应对部…

【QT+QGIS跨平台编译】之五十一:【QGIS_CORE跨平台编译】—【qgsexpressionparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存

通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存 版本信息代码 新开发的PCIE设备在做服务器适配时,有时需要服务器厂家更新BMC或BIOS固件。同时,我们也希望对PCIE设备做一些检测,最后收集一些信息存档。如果需要处理的服务器很多,通过BMC的界…

【严格递增】2972统计移除递增子数组的数目 II

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 严格递增 子数组 LeetCode2972. 统计移除递增子数组的数目 II 给你一个下标从 0 开始的 正 整数数组 nums 。 如果 nums 的一个子数组满足&#xff1a;移除这个子数组后剩余元素 严格递增 &#xff0c;那么我们称这个子…