HTTP请求拦截器链

文章目录

  • HTTP请求拦截器链
    • 需求定义
    • 写一个Controller方法接口
    • 写三个http请求拦截器
    • 把拦截器加入到配置中,并且配置拦截规则
    • 在postman里面发送请求,看下测试结果是否正确
    • 第三个参数的作用

HTTP请求拦截器链

需求定义

我们写一个包含三个HTTP请求拦截器的拦截器链,写一个controller控制器方法,最后在postman里面调用controller控制器里面的接口方法,看看这个请求的经过路径。
首先说结论,如下图:
在这里插入图片描述

写一个Controller方法接口

如下图:
在这里插入图片描述

写三个http请求拦截器

我们定义三个http请求拦截器如下图:
在这里插入图片描述
然后每个http请求拦截器都实现preHandle、postHandle、afterCompletion这三个方法,如下图:
在这里插入图片描述

preHandle、postHandle、afterCompletion方法的执行时机?
当一个http请求发过来的时候,如果没有http请求拦截器这个请求是会直接发送到Controller控制器里面的,但是如果有http请求拦截器的话,外部发来的http请求会先进入到拦截器中拦截。可能我们程序中有多个http请求拦截器,比如有三个http请求拦截器,那么这三个http请求拦截器会组成一个拦截器链,外部发来的http请求先进入第一个拦截器的preHandle方法,如果这个拦截器放行了,也就是preHandle方法返回了true,那么该请求就会被第一个拦截器放行,然后该请求会进入到拦截器链中的第一个拦截器中,同样是进入到preHandle方法当中,如果preHandle方法返回true,则同样放行;接着http请求进入到第三个拦截器的preHandle方法里面;最后该请求才会进入到controller控制器中执行。注意如果preHandle方法返回false,则该请求就不能传递到controller控制器中了。

执行完controller方法之后,该http请求就算是执行完毕了,接着会从拦截器链中倒着走出去,先走拦截器3的postHandle方法,再走拦截器2的postHandle方法,最后再走拦截器1的postHandle方法;
走完了postHandle方法之后,再走拦截器3的afterCompletion方法,再走拦截器2的afterCompletion方法,最后走拦截器1的afterCompletion方法;

这样就执行完了一个http请求的全部过程,流程图如下图:
在这里插入图片描述

把拦截器加入到配置中,并且配置拦截规则

我们需要写一个拦截器配置类,把需要用到的拦截器放到拦截器链中,并且配置每个拦截器拦截的http请求的规则,就是拦截什么样的http请求,比如只拦截/user的请求,或者只拦截/student的请求,具体是什么样的请求规则,我们可以自定义。拦截器配置类如下图:
在这里插入图片描述
可以看到我们这里把拦截器1、拦截器2、拦截器3全部都放到了拦截器链中,然后每个拦截器都是拦截所有的http请求。

在postman里面发送请求,看下测试结果是否正确

首先看下我们控制器里面接收请求的方法,如下图:
在这里插入图片描述

然后在postman里面发送一个/test请求,如下图:
在这里插入图片描述
可以看到我们的controller控制器里面的方法确实成功执行了,接着去看下在执行controller控制器方法之前,三个拦截器里面的preHandle方法是否执行了,以及在执行controller控制器方法之后,三个拦截器里面的postHandle方法和afterCompletion方法是否执行了,控制台输出信息如下图:
在这里插入图片描述
可以发现这里在执行Controller控制器之前确实执行了拦截器中的preHandle方法,以及在执行Controller控制器之后也确实执行了拦截器中的postHandle和afterCompletion方法,并且顺序也是正确的。

第三个参数的作用

如下图:
在这里插入图片描述

第三个参数的作用主要是:提供对当前请求所匹配的处理器的描述
在SpringMVC中,handler参数通常是一个HandlerMethod对象实例,它包含了请求对应的Controller控制器以及调用的控制器里面的方法的信息。通过第三个参数handler,我们可以了解到具体是哪个Controller控制器,以及具体是控制器里面的哪个方法处理请求的。

比如有下面一个场景,当访问UserController控制器中的getUsers方法的时候,我们需要认证一下当前用户是不是“董事长”,只有是董事长,我们的认证拦截器才会通过,那我们该怎么利用第三个参数呢?代码如下:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AuthenticationInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取当前请求的处理器对象Object handlerObj = handler;// 判断处理器对象是否为Controller方法if (handlerObj instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handlerObj;// 获取控制器类和方法信息Class<?> controllerClass = handlerMethod.getBeanType();String methodName = handlerMethod.getMethod().getName();// 如果处理http请求的控制器是UserController,并且里面的处理方法是getUsers,这个时候我们需要在拦截器里面校验一下认证逻辑,看看当前用户是不是董事长,不是的话不放行if (controllerClass == UserController.class && "getUsers".equals(methodName)) {boolean result = authenticateUser(request);if (!result) {// 如果用户未通过身份验证,阻止请求继续执行return false;}}}// 如果身份验证通过,则允许请求继续执行return true;}private boolean authenticateUser(HttpServletRequest request) {// 通过request传递的参数得到当前用户姓名if (currentUserName.equals("董事长")) {return true;}return false;}
}

注意我们第三个参数handler也不全是Controller处理器对象,也可能是其他对象,但是如果是Controller处理器对象的话,它的类型就是HandlerMethod类型,因此我们这里才会有一个类型判断,如下图:
在这里插入图片描述

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

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

相关文章

硬币检测电路设计

一、来源&#xff1a;凡亿教育 第一场&#xff1a;硬币检测装置原理分析、电路设计以及器件选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Zh4y1V7Px/?p1&vd_source43eb1cb50ad3175d7f3b9385905cd88f 二、开发软件&#xff1a;KEIL MDK 三、主控芯片&#…

vs2019 c++20 规范 STL库中关于时间的模板

在学习线程的时候&#xff0c;一些函数会让线程等待或睡眠一段时间。函数形参是时间单位&#xff0c;那么在 c 中是如何记录和表示时间的呢&#xff1f;以下给出模板简图&#xff1a; 谢谢

CMake的作用域:public/private/interface

在 CMake 中&#xff0c;public、private和 interface是用来指定目标属性的作用域的关键字&#xff0c;这三个有什么区别呢&#xff1f;这些关键字用于控制属性的可见性和传递性&#xff0c;影响了目标之间的依赖关系和属性传递。 public 如果在一个目标上使用 public关键字时…

mysql去除重复数据

需求描述 doc表有很多重复的title,想去除掉重复的记录 表结构 CREATE TABLE doc (id INT PRIMARY KEY,title VARCHAR(255),content TEXT );去重SQL -- 创建临时表 CREATE TEMPORARY TABLE temp_doc AS SELECT * FROM doc WHERE 10;-- 插入唯一的记录&#xff08;每个title最…

FPGA定点数FFT过后转换为浮点数与Matlab计算的FFT结果进行比对

目录 1.前言2.FPGA的testbench中如何读取数据文件3.FPGA的testbench中如何将输出数据存储在文件中4.Matlab去读取testbench存储的文件数据4.1纯数字不带编码4.2 带编码的数据&#xff0c;如定点数 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 前面一篇文章讲了&…

基础—SQL—DCL(数据控制语言)小结

一、总结 在SQL分类中的DCL语句部分&#xff0c;主要讲到了两个部分的知识。 1、用户管理 用户管理&#xff0c;主要是管理哪些用户可以访问当前 mysql 数据库。 包括&#xff1a;创建用户、修改用户密码以及删除用户 2、权限控制 权限管理&#xff0c;主要是控制我们当前用户…

iOS App Tech Support(URL)

咪萌是一个语音类交友直播App&#xff0c;分成红艳知己&#xff0c;点唱大厅&#xff0c;歌手驻唱等不同房间分类&#xff0c;广场可以看到其他人发的一些动态&#xff0c;一个非常不错的App 如果您有任何疑问&#xff0c;您可以留言或者将问题发送至我们的邮箱。 我们会第一时…

Python知识点5---字符串的使用

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的字符串在使用上和其他语言的差别不大&#xff0c;常规操作都…

GPT-4o VS GPT-3.5 完胜

前言&#xff1a; 最近&#xff0c;GPT-4o已经限时免费开放了&#xff0c;试了一下&#xff0c;然后&#xff0c;说我的时间到了&#xff0c;然后&#xff0c;有给我转到3.5&#xff0c;正好遇到一个问题做一下对吧&#xff0c;感觉4O完胜啊。3.5还是很好胡诌&#xff0c;也就…

java web爬虫

目录 读取本地文件 从网站读取文件 java爬虫 总结 读取本地文件 import java.io.File; import java.io.PrintWriter; import java.util.Scanner;public class ReplaceText {public static void main() throws Exception{File file new File("basic\\test.txt"…

如何使用Dora SDK完成Fragment流式切换和非流式切换

我想大家对Fragment都不陌生&#xff0c;它作为界面碎片被使用在Activity中&#xff0c;如果只是更换Activity中的一小部分界面&#xff0c;是没有必要再重新打开一个新的Activity的。有时&#xff0c;即使要更换完整的UI布局&#xff0c;也可以使用Fragment来切换界面。 何…

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器&#xff0c;以下是对其的详细介绍&#xff1a; 1. 定义与别称&#xff1a; 激光焊接机&#xff0c;又常称为激光焊机、镭射焊机&#xff0c;是材料加工激光焊接时用的机器。 2. 工作原理&#xff1a; 激光焊接是利用高能量…

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…

电商商城管理系统

前言&#x1f440;~ 将近一个月没更新了&#xff0c;最近忙着学校的大作业&#xff0c;一个是微信小程序的、一个是互联网编程的&#xff0c;也是忙完了这个大作业&#xff0c;这个大作业前端使用了vue、后端使用了java&#xff0c;接下来展示一些效果图&#xff0c;如果有需要…

HTTPS协议原理

HTTPS协议原理 一.前言-为何要有https协议二.加密与中间方劫持1.什么是加密2.为何要加密3.对称加密1.小例子2.好处和缺点 4.非对称加密5.数据指纹/数据摘要 三.站在设计者的角度提出方案1.只使用非对称加密 : 且只有server有密钥2.只使用非对称加密 : 且双方都有密钥3.非对称对…

网络安全-钓鱼篇-利用cs进行钓鱼

一、环境 自行搭建&#xff0c;kill&#xff0c;Windows10&#xff0c;cs 二、原理 如图所示 三、钓鱼演示 首先第一步&#xff1a;打开System Profiler-分析器功能 选择克隆www.baidu.com页面做钓鱼 之后我们通过包装域名&#xff0c;各种手段让攻击对象访问&#xff1a;h…

TH方程学习(3)

一、编程实现 根据论文给出的案例&#xff0c;使用TH方程进行数值仿真 1.初始化条件 %% 参考文献<New State Transition Matrix for Relative Motion on an Aribitrary Elliptical Orbit> %% 作者 Yamanaka Koji clc;clear global miu Re miu 3.986e5; Re 6378.137;…

阿里云语音合成TTS直播助手软件开发

阿里云的TTS比较便宜&#xff0c;效果比不了开源克隆的那种&#xff0c;比纯机器人效果好一点点 阿里云sambert https://help.aliyun.com/zh/dashscope/developer-reference/quick-start-13 Sambert系列模型 1万字1元 &#xff0c;每主账号每模型每月3万字免费 创建API-KEY htt…

域内用户枚举和密码喷洒

一. 域内用户枚举原理和流量 1. 原理 在AS-REQ阶段客户端向AS发送用户名&#xff0c;cname字典存放用户名&#xff0c;AS对用户名进行验证&#xff0c;用户存在和不存在返回的数据包不一样。 不同之处主要是在返回数据包中的状态码不同&#xff0c;根据不同的状态码来区分账…