Spring Boot统一功能处理之拦截器

本篇主要介绍Spring Boot的统一功能处理中的拦截器。

目录

一、拦截器的基本使用

二、拦截器实操

三、浅尝源码

初始化DispatcherServerlet

处理请求(doDispatch)

四、适配器模式


一、拦截器的基本使用

在一般的学校或者社区门口,通常会安排几个保安大爷来进行身份验证,只有身份符合要求的人才会被放行,否则则会被大爷拦住,而拦截器就像我们程序的保安大爷,只有通过我们自己定义的拦截规则,请求才能被放行到目标接口上。

下面我们来看看如何在Spring Boot中使用拦截器 

 在项目中设置拦截,我们需要先自己定义一些拦截器,里面包含一些具体的拦截规则,定义拦截器的代码如下:

(1)首先创建一个拦截类,通常以“Interceptor”作为类名的后半部分,这里我们定义一个LoginInterceptor类,意为与登录相关的拦截器,然后让该类实现一个HandlerInterceptor接口,具体如下:

@Component
public class LoginInterceptor implements HandlerInterceptor {}

(2)重写三个方法:

 @Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}@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 {}

其中preHandle为在目标方法执行前要执行的方法,其返回值如果为true,则会被放行去执行目标方法,为false则拦截,我们可以在这个方法里根据需求定义拦截规则。postHandle为目标方法执行后要执行的方法。afterCompletion为最后视图渲染完后最后执行的方法(由于现在都是前后端分离了,后端一般不处理视图,因此这个方法不需要过多了解)。

定义好拦截器后我们还需要配置拦截器,具体配置流程如下:

(1)创建配置类(一般以Config结尾,这里以为WebConfig),实现WebMvcConfigurer接口:

public class WebConfig implements WebMvcConfigurer {
}

(2)然后重写addInterceptor方法

@Overridepublic void addInterceptors(InterceptorRegistry registry) {}

(3)然后我们在里面添加我们需要配置的拦截器,具体如下:

这里我们可以通过@Autowired注入一个LoginInterceptor对象,也可以直接在参数里new一个,只要是传入一个实现前面的HandlerInterceptor接口的类的对象即可。

(4)然后在配置我们需要拦截的路径(即请求url中ip地址端口号的后面的部分):

 这里的”/**"表示任意路径,例如“/user/book、/user”等,另外还有“/*"他只能表示一级路径,例如:

”/user,/book"等。

(4)由于通常我们并不需要所有路径都进行拦截(例如登录请求),因此我们还需要排除一些路径,让这些路径不被拦截,具体如下:

 (5)最后我们还需要把这个类放到Spring容器里,由于这里与配置相关,所有使用@Configuration。

二、拦截器实操

 接下来我们来实操一下。首先我们创建一个Controller类,在里面定义一个login方法(这里只是简单测试一下,不进行密码校验,只是给用户设置一个登录状态而已):

 然后再添加几个测试方法:

然后我们再来定义一下拦截器,再preHandle方法中设置一下拦截规则,只有处于登录状态才能放行 ,并在另外两个方法中打印日志来进行观察:

然后在注册(配置)一下拦截器(不拦截login方法,其他全部拦截) :

最后我们通过postMan构造请求来访问一下这些方法.

先访问一下test01 

可以发现返回的响应为空,也就是说请求被拦截器拦截到了。

然后我们再来访问一下login

可以发现响应有数据了,但由于我们请求中没有传值,导致接口中的两个参数为空,所以返回了false。接下来我们补上这两个值再访问一下

 可以发现响应中返回true了,同时这也意味着我们现在已经给用户设置成登录状态了,此时我们再来访问test01

可以发现响应已经有数据了。这也就意味着这个请求已经被拦截器放行了。

最后我们再来看一下 控制台的日志:

可以发现,拦截器是严格按照顺序执行相关方法的 ,如果请求被拦截了,则只会执行postHandle方法就返回了,如果请求被放行则会按顺序执行完拦截器中的三个方法。并且对于配置中没有涉及到的路径,和被排除的路径,则根本不会进入到拦截器。

三、浅尝源码

接下来,我们来浅浅阅读一下与拦截器相关的部分源码。

初始化DispatcherServerlet

仔细观察日志可以发现,当我们的服务器接收到第一个来自前端的请求时,会初始化一个dispatcherServerlet类。

它的初始化方法为init(),具体实现是在其父类HttpServerletBean中实现的

init方法首先创建了一个PropertyValues类,这个类我并不知道是干嘛的,但根据其名称可以大体猜出来应该是去读一些配置,并且下面的if语句 判断这个对象是否为空,不为空才去执行相关逻辑,因此可以推测出if语句里应该是去根据读到的配置去进行一些设置。在init方法最后执行了一个initServerletBean方法,,我们来具体看一下这个方法,

转到定义可以发现HttpServerletBean中并未实现这个方法,接下来我们去其子类看一下 

 

 可以发现其子类FrameworkServerlet重写了这个方法,并具体进行了实现。仔细观察可以发现这个方法主要是在打印日志,日志的内容就是我们在前面控制台所看到的

 

并且 这里还进行了计时,并打印在了日志里。除去日志的部分可以发现这个方法就只剩下try-catch中的内容了:

接下来我们继续进入到其中的initWebAppliactionContext ()来看一下,

根据名字可以发现这个方法应该是用来 初始化WebApplicationContext的,并且通过代码大致可以发现这个方法会先去从类的成员属性中获取WebAppliactionContext,如果成员属性不为空,则会直接用成员属性的,如果为空,则调用findWebApplication去寻找一个并使用,如果没找到,则去创建一个。执行完上面第一个红框里的内容后,wac应该是已经不再为空了的,接下来调用onRefresh方法,可以发现这里加了锁来防止线程安全问题。接下来我们进到onRefresh方法来看一下:

可以发现FrameWorkServerlet中并未进行实现,我们再进到其子类看一下:

 可以发现子类进行了实现,并且此时这个子类就是我们要初始化的DispatchServerlet。然后我们再看看这个方法里使用的initStrategies()方法:

通过方法名称可以发现这个方法是在进行一些初始化,然后再通过具体代码可以发现这个方法初始化了九个组件,这些组件就是Spring的九大组件,其名称如下:

  • MultipartResolver:文件上传解析器
  • LocaleResolver:区域解析器
  • ThemeResolver:主题解析器
  • HandlerMappings:处理器映射器
  • HandlerAdapters:处理器适配器
  • HandlerExceptionResolvers:异常处理器解析器
  • RequestToviewNameTranslator:视图名称转换器
  • ViewResolvers:视图解析器
  • FlashMapManager:FlashMap管理器

初始化这些组件后,DispatchServerlet就初始化完了。

处理请求(doDispatch)

初始化完成后,DispatchServerlet就能进行请求的处理了,处理请求,主要通过DispatchServerlet类的doDispatch方法来对请求调度给Controller来执行,下面我们来详细看一下这个方法:

首先它会去获取一个与请求对应的处理器,然后再根据处理器去获取一个能够使用的适配器

然后再根据适配器来顺序执行拦截器的相关方法以及目标方法 然后处理视图,并执行最后的afterCompletion方法

四、适配器模式

在前面浅尝源码时,提到了适配器这个概念,适配器使用到了一种设计模式 --- 适配器模式。适配器模式能将一个类的接口,转换成符合客户期待的接口,从而使原本并不能兼容使用的接口也能使用了。简单来说,就是有一个接口,由于兼容问题并不能直接使用,需要在中间加上一个适配器才能够使用这个接口。例如我们生活中的转接头,当我们的手机是Type_c的充电口,而我们却只有苹果的数据线时,这根苹果的数据线自然是冲不了我们的手机的,此时就需要一个转接头了,通过转接头,我们就可以给手机充电了。此处转接头就相当于我们的的适配器,而转接头的设计就相当于是是适配器模式这种设计思想

可能有人会说为什么 不在一开始就设计成兼容的接口呢,这样就没必要大费周章弄一个适配器了,这样固然好,但人并不是万能的,总会有我们意想不到的情况出现,面面俱到几乎是不可能的,就像使用Type-c接口的手机厂商肯定不会想到有人会用苹果的数据线来充电,但既然这个需求是存在的,也就不能不去实现了,重新设计的话,成本又太高,因此,就只能使用适配器这一无奈之举了。

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

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

相关文章

selenium添加代理(有账号密码)

以下为各种尝试的记录,正确实现可直接参考最后一条! 1,导入Proxy库来添加capabilities属性:可以访问网站,但ip还是本机ip from selenium import webdriver from selenium.webdriver.chrome.options import Options f…

【TensorRT】TensorRT C# API 项目更新 (1):支持动态Bath输入模型推理(下篇)

4. 接口应用 关于该项目的调用方式在上一篇文章中已经进行了详细介绍,具体使用可以参考《最新发布!TensorRT C# API :基于C#与TensorRT部署深度学习模型》,下面结合Yolov8-cls模型详细介绍一下更新的接口使用方法。 4.1 创建并配…

Java零基础入门-Java反射机制

一、概述 我们都听说过java有个反射机制,通过反射机制我们可以更深入的控制程序的运行过程。例如,在程序进入到运行期间,由用户输入一个类名,然后我们可以动态获取到该类拥有的所有类结构、属性名和方法,甚至还可以任意…

Java快速入门系列-9(Spring框架与Spring Boot —— 深度探索及实践指南)

第九章:Spring框架与Spring Boot —— 深度探索及实践指南 9.1 Spring框架概述9.2 Spring IoC容器9.3 Spring AOP9.4 Spring MVC9.5 Spring Data JPA/Hibernate9.6 Spring Boot快速入门与核心特性9.7 Spring Boot的自动配置与启动流程详解9.8 创建RESTful服务与数据库交互实践…

专为苹果系统设计的精美可视化图表 | 开源日报 No.219

danielgindi/Charts Stars: 27.3k License: Apache-2.0 Charts 是为 iOS/tvOS/OSX 提供美观图表的开源项目,是跨平台 MPAndroidChart 在苹果设备上的实现。该项目提供了以下主要功能和优势: 支持 iOS、tvOS 和 macOS 平台使用 Swift 编写,可…

Ceph学习 -6.Nautilus版本集群部署

文章目录 1.集群部署1.1 环境概述1.1.1 基础知识1.1.2 环境规划1.1.3 小结 1.2 准备工作1.2.1 基本环境1.2.2 软件安装1.2.3 小结 1.3 Ceph部署1.3.1 集群创建1.3.2 部署Mon1.3.3 小结 1.4 Ceph部署21.4.1 Mon认证1.4.2 Mgr环境1.4.3 小结 1.5 OSD环境1.5.1 基本环境1.5.2 OSD实…

数据结构-移除元素(简单)

题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

可视化大屏的应用(11):智慧运维领域的得力助手

一、什么是智慧运维 智慧运维(Smart Operations and Maintenance,简称智慧运维)是一种利用先进的信息技术和数据分析手段,对设备、设施或系统进行监测、分析和优化管理的运维方式。它通过实时监测数据、智能分析和预测&#xff0…

Redis中的集群(五)

集群 在集群中执行命令 MOVED错误。 当节点发现键所在的槽并非由自己负责处理的时候&#xff0c;节点就会向客户端返回一个MOVED错误&#xff0c;指引客户端转向至正在负责槽的节点&#xff0c;MOVED错误的格式为: MOVED <slot> <ip>:<port>其中slot为键…

centos 7.9 nginx本地化安装,把镜像改成阿里云

1.把centos7.9系统切换到阿里云的镜像源 1.1.先备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2.下载新的CentOS-Base.repo配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo特别…

盲人独立出行的新里程:“盲人软件”赋能无障碍生活

作为一名资深记者&#xff0c;我始终致力于探索并分享那些以科技之力提升特殊群体生活质量的故事。最近&#xff0c;一款名为蝙蝠避障的盲人软件进入了我的视野&#xff0c;其强大的避障导航功能正悄然改变着视障人士的出行方式&#xff0c;赋予他们前所未有的独立生活能力。 …

【多线程】线程池Future和FutureTask

【多线程】线程池Future和FutureTask 【一】Future概述【1】Future的出现原因【2】Future结构图 【二】Future详解【1】Future接口源码【2】Future的5个方法【3】ThreadPoolExecutor提供了三个方法&#xff0c;来获取返回值&#xff08;1&#xff09;submit(Runnable r)&#x…

【ARM 裸机】汇编 led 驱动之原理分析

1、我们为什么要学习汇编&#xff1f;&#xff1f;&#xff1f; 之前我们或许接触过 STM32 以及其他的 32 位的 MCU ,都是基于 C 语言环境进行编程的&#xff0c;都没怎么注意汇编&#xff0c;是因为 ST 公司早已将启动文件写好了&#xff0c;新建一个 STM32 工程的时候&#…

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化) 目录 回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)预测效果基本介绍程序设计参考资料预测效果

图像生成:Pytorch实现一个简单的对抗生成网络模型

图像生成&#xff1a;Pytorch实现一个简单的对抗生成网络模型 前言相关介绍具体步骤准备并读取数据集定义生成器定义判别器定义损失函数定义优化器开始训练完整代码 训练生成的图片 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&…

实战Java高并发程序设计课

课程介绍 实战Java高并发程序设计课是一门针对Java开发者的培训课程&#xff0c;重点关注如何设计和优化高并发的程序。学员将学习到并发编程的基本概念、线程池的使用、锁机制、并发集合等技术&#xff0c;并通过实际案例进行实践操作。这门课程旨在帮助开发者掌握并发编程的…

最祥解决python 将Dataframe格式数据上传数据库所碰到的问题

碰到的问题 上传Datafrane格式的数据到数据库 会碰见很多错误 举几个很普遍遇到的问题(主要以SqlServer举例) 这里解释下 将截断字符串或二进制数据 这个是字符长度超过数据库设置的长度 然后还有字符转int失败 或者字符串转换日期/或时间失败 这个是碰到的需要解决的最多的问…

Java面试题戏剧

目录 第一幕 、第一场&#xff09;某大厦楼下大门前第二场&#xff09;电梯中第三场&#xff09;走廊中 第二幕、第一场&#xff09;公司前台第二场&#xff09;公司卫生间 第三幕、第一场&#xff09;一场异常面试 第四幕 、第一场&#xff09;大厦楼下门口第二场&#xff09;…

Lobe UI - 基于 AntDesign 开发的 AIGC Web 应用的开源 UI 组件库

今天推荐一个可以快速开发 ChatGPT UI 界面的组件库&#xff0c;质量很高&#xff0c;拿来就能用。 Lobe UI 是由 lobehub 团队开发的一套 web UI 组件库&#xff0c;和我之前推荐的很多通用型的 UI 组件库不同&#xff0c;Lobe UI 是专门为目前火热的 AIGC 应用开发而打造&am…

鸿蒙实战开发-如何实现选择并查看文档与媒体文件

介绍 应用使用ohos.file.picker、ohos.multimedia.mediaLibrary、ohos.file.fs 等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用展示出最近打开过的文档信息&#xf…