gin框架内容(三)--中间件

news/2024/5/18 16:16:39

gin框架内容(三)--中间件

Gin框架允许开发者在处理请求的过程中,加入用户自己的函数。这个函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等
即比如,如果访问一个网页的话,不管访问什么路径都需要进行登录,此时就需要为所有路径的处理函数进行统一一个中间件
Gin中的中间件必须是一个gin.HandlerFunc类型
 

一、中间件的设置

1.1为路由单独注册中间件

package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time"
)func indexHandler(c *gin.Context) {fmt.Println("index.....")c.JSON(http.StatusOK, gin.H{"msg": "index",})
}// 定义一个中间件
func m1(c *gin.Context) {fmt.Println("m1 in.........")start := time.Now()c.Next() //调用后续的处理函数,即indexHandler//Since是一个函数,传入的参数是(t Time),返回值是 Duration//Duration是一个自定义类型,即: type Duration int64cost := time.Since(start) //从开始时间到现在花费的时间fmt.Println(cost)fmt.Println("m1 out.........")
}func main() {r := gin.Default()// m1处于indexHandler函数的前面,请求来之后,先走m1,再走indexr.GET("/index", m1, indexHandler)_ = r.Run()
}

 

1.2为全局路由注册1个中间件

定义的全局中间件,下面的每个路由调用都是经过这个全局中间件

 

 

1.3为全局路由注册2个中间件【多个中间件也是这样的思路】

package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time"
)func indexHandler(c *gin.Context) {fmt.Println("index.....")c.JSON(http.StatusOK, gin.H{"msg": "index",})
}// 定义一个中间件m1
func m1(c *gin.Context) {fmt.Println("m1 in.........")start := time.Now()c.Next()cost := time.Since(start)fmt.Println(cost)fmt.Println("m1 out.........")
}// 定义一个中间件m2
func m2(c *gin.Context) {fmt.Println("m2 in.........")c.Next()fmt.Println("m2 out.........")
}
func main() {r := gin.Default()//确定中间件中间的关系r.Use(m1, m2)r.GET("/index", indexHandler)r.GET("/shop", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"msg": "shop",})})r.GET("/user", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"msg": "user",})})_ = r.Run()
}

 

 从上面的打印关系可以看出,先通过第一个中间件M1的“

c.Next()的前半部分,然后在到M2,最后到index,然后在执行c.Next()的后半部分,

这就是一个中间件的链条

1.4中间件的后面路由停止执行

1.4.1终止执行1

package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time"
)func indexHandler(c *gin.Context) {fmt.Println("index.....")c.JSON(http.StatusOK, gin.H{"msg": "index",})
}// 定义一个中间件
func m1(c *gin.Context) {fmt.Println("m1 in.........")start := time.Now()c.Next()cost := time.Since(start)fmt.Println(cost)fmt.Println("m1 out.........")
}// 定义一个中间件
func m2(c *gin.Context) {fmt.Println("m2 in.........")c.Abort() //阻止调用后续的处理函数fmt.Println("m2 out.........")
}
func main() {r := gin.Default()r.Use(m1, m2)r.GET("/index", indexHandler)r.GET("/shop", func(c *gin.Context) {fmt.Println("1111")c.JSON(http.StatusOK, gin.H{"msg": "shop",})})r.GET("/user", func(c *gin.Context) {fmt.Println("222222222")c.JSON(http.StatusOK, gin.H{"msg": "user",})})_ = r.Run()
}

因为m2中有个“

c.Abort() //阻止调用后续的处理函数

”阻止后续内容执行,到这里就是返回了,根本执行不到后续路由信息

 

 

 

1.4.2终止执行2 return

 

 

 

1.5数据传递

在中间件里做一些操作,然后在处理函数里拿到或者其它的中间件里拿到对应的数据

package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time"
)func indexHandler(c *gin.Context) {fmt.Println("index.....")//Get是*Context的方法 传入的参数是(key string) ,返回值是(value interface{}, exists bool)name, ok := c.Get("name")if !ok {name = "匿名用户"}c.JSON(http.StatusOK, gin.H{"msg": name,})
}// 定义一个中间件
func m1(c *gin.Context) {fmt.Println("m1 in.........")start := time.Now()c.Next()cost := time.Since(start)fmt.Println(cost)name, ok := c.Get("name")if !ok {name = "匿名用户"}fmt.Println(name)fmt.Println("m1 out.........")
}// 定义一个中间件
func m2(c *gin.Context) {fmt.Println("m2 in.........")c.Set("name", "tom")fmt.Println("m2 out.........")
}
func main() {r := gin.Default()r.Use(m1, m2)r.GET("/index", indexHandler)_ = r.Run()
}

 


http://www.mrgr.cn/p/45420268

相关文章

Generative Diffusion Prior for Unified Image Restoration and Enhancement 论文阅读笔记

这是CVPR2023的一篇用diffusion先验做图像修复和图像增强的论文 之前有一篇工作做了diffusion先验(Bahjat Kawar, Michael Elad, Stefano Ermon, and Jiaming Song, “Denoising diffusion restoration models,” arXiv preprint arXiv:2201.11793, 2022. 2, 4, 6,…

rcu链表综合实践

基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员,要先学会使用,再探究其内部原理。 链表的数据结构: struct list_head {struct list_head *next, *prev; };还有一种:struct h…

【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

VAE-根据李宏毅视频总结的最通俗理解

1.VAE的直观理解 先简单了解一下自编码器,也就是常说的Auto-Encoder。Auto-Encoder包括一个编码器(Encoder)和一个解码器(Decoder)。其结构如下: 自编码器是一种先把输入数据压缩为某种编码, 后仅通过该编…

Python - Opencv + pyzbar实时摄像头识别二维码

直接上代码: import cv2 from pyzbar.pyzbar import decodecap cv2.VideoCapture(0) # 打开摄像头while True: # 循环读取摄像头帧ret, frame cap.read()# 在循环中,将每一帧作为图像输入,使用pyzbar的decode()函数识别二维码barcodes …

np.bincount、np.digitize、np.unique、np.histogram、np.searchsorted

np.bincount 简介 np.bincount是统计数组中数字出现数量的函数,数值n在输入数组x中每出现1次,则输出o的o[n]1。 函数 官方文档 函数参数: x: 输入,1维非负数组weights: 权重数组, 可选参数,如果指定了这一参数&am…

函数指针数组

前面学习过数组 指针数组:用来存放数组指针(地址)的数组 int main() {int arr1[] { 0 };int arr2[] { 0 };int arr3[] { 0 };int* p[3] { arr1,arr2,arr3 };//指针数组return 0; }那么函数指针数组,就是用来存放几个类型相同…

PyTorch - GPU入门教程1

1. 安装GPU版本的PyTorch 登录PyTorch官网https://pytorch.org/,下载对应CUDA版本的PyTorch【不能直接pip install,否则安装上的是CPU版本的】 2. 查看GPU信息 (1)重要信息 !nvidia-smi我的GPU版本很垃圾,本blog仅…

GitHub上怎么寻找项目?

前言 下面由我精心整理的关于github项目资源搜索的一些方法,这些方法可以帮助你更快更精确的搜寻到你需要的符合你要求的项目。 写文章不易,如果这一篇问文章对你有帮助,求点赞求收藏~ 好,下面我们直接进入正题——> 首先我…

RS485或RS232转ETHERCAT连接ethercat转换器

最近,生产管理设备中经常会遇到两种协议不相同的情况,这严重阻碍了设备之间的通讯,串口设备的数据不能直接传输给ETHERCAT。这可怎么办呢? 别担心,捷米JM-ECT-RS485/232来了!这是一款自主研发的ETHERCAT从站…

多线程案例 | 单例模式、阻塞队列、定时器、线程池

多线程案例 1、案例一:线程安全的单例模式 单例模式 单例模式是设计模式的一种 什么是设计模式? 设计模式好比象棋中的 “棋谱”,红方当头炮,黑方马来跳,针对红方的一些走法,黑方应招的时候有一些固定的…

scrcpy2.0+实时将手机画面显示在屏幕上并用鼠标模拟点击2023.7.26

想要用AI代打手游,除了模拟器登录,也可以直接使用第三方工具Scrcpy,来自github,它是一个开源的屏幕镜像工具,可以在电脑上显示Android设备的画面,并支持使用鼠标进行交互。 目录 1. 下载安装2. scrcpy的高级…

【Vue3+Ts+Vite】配置滚动条样式

一、先看效果 二、直接上代码 <template><div class"main-container"><h1 v-for"index in 50" :key"index">这是home页面</h1></div> </template> <style lang"scss" scoped> .main-conta…

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式&#xff1a;https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下&#xff0c;然后引进页面里就行了&#xff0c;全局样式就放app.scss&#xff0c;单页面就引入单页面 注&#xff1a; .title…

目标检测之3维合成

现在有一系列的图片&#xff0c;图片之间可以按照z轴方向进行排列。图片经过了目标检测&#xff0c;输出了一系列的检测框&#xff0c;现在的需求是将检测框按类别进行合成&#xff0c;以在3维上生成检测结果。 思路&#xff1a;将图片按照z轴方向排列&#xff0c;以z轴索引作…

web流程自动化详解

今天给大家带来Selenium的相关解释操作 一、Selenium Selenium是一个用于自动化Web浏览器操作的开源工具和框架。它提供了一组API&#xff08;应用程序接口&#xff09;&#xff0c;可以让开发人员使用多种编程语言&#xff08;如Java、Python、C#等&#xff09;编写测试脚本&…

掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作等

目录 专题一 认识主被动无人机遥感数据 专题二 预处理无人机遥感数据 专题三 定量估算农林植被关键性状 专题四 期刊论文插图精细制作与Appdesigner应用开发 近地面无人机植被定量遥感与生理参数反演 更多推荐 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

Flutter:flutter_local_notifications——消息推送的学习

前言 注&#xff1a; 刚开始学习&#xff0c;如果某些案例使用时遇到问题&#xff0c;可以自行百度、查看官方案例、官方github。 简介 Flutter Local Notifications是一个用于在Flutter应用程序中显示本地通知的插件。它提供了一个简单而强大的方法来在设备上发送通知&#…

flask 点赞系统

dianzan.html页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点赞系统</title> </head> <body><h2>这是一个点赞系统</h2><table border"1"><…