gin框架使用系列之六——自定义中间件

  • 系列目录
    • 《gin框架使用系列之一——快速启动和url分组》
    • 《gin框架使用系列之二——uri占位符和占位符变量的获取》
    • 《gin框架使用系列之三——获取表单数据》
    • 《gin框架使用系列之四——json和protobuf的渲染》
    • 《gin框架使用系列之五——表单校验》

一、gin中间件概述

  gin中将很多需要拓展的功能都归纳到中间件中,比如说上篇我们用到的国际化的转换器,就是一个中间件。在大多数情况下,中间件可以理解为一个拦截器,gin中将中间件组成一个链,在调用的过程中依次执行中间件,就可以实现拦截的目的。
  gin中的中间件实现其实很简单,其实就是一个func(*Context)的函数类型,并在使用的时候在router.use()中注入即可。尤其是因为有routeGroup功能,gin还可以支持给不同的group添加不同的中间件
  在中间件中,调用c.Next()方法可以让直行链继续,调用c.Abort()方法阻断链的继续执行
  注意:在gin的中间件中,直接return不能阻断链条的执行,必须调用c.Abort()方法才行

二、自定义token校验中间件示例

我们自定一个token校验的中间件,来掩饰中间件的使用方法
自定义中间件的核心代码如下:

func checkToken(c *gin.Context) {var token string// 找到token数据for key, value := range c.Request.Header {if strings.ToLower(key) == "x-token" {token = value[0]}}// 校验tokenif token != "hong" {c.JSON(http.StatusBadRequest, gin.H{"msg": "token错误",})c.Abort()}c.Next()
}

整体示例代码如下:

package mainimport ("github.com/gin-gonic/gin""net/http""strings"
)func checkToken(c *gin.Context) {var token string// 找到token数据for key, value := range c.Request.Header {if strings.ToLower(key) == "x-token" {token = value[0]}}// 校验tokenif token != "hong" {c.JSON(http.StatusBadRequest, gin.H{"msg": "token错误",})c.Abort()}c.Next()
}func main() {router := gin.Default()// 添加token校验的中间件router.Use(checkToken)router.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})router.Run() // listen and serve on 0.0.0.0:8080
}

运行程序,添加错误token的访问结果
在这里插入图片描述
添加正确token的访问结果
在这里插入图片描述

后记
  个人总结,欢迎转载、评论、批评指正

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

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

相关文章

2024年中职“网络安全“—数字调查取证(attack817.pcapng)

目录 ​1.通过分析数据包找出恶意用户最初访问HTTP服务的包号,将该值作为Flag值提交, Flag格式为flag{xxx}; 2.继续查看数据包文件分析出恶意用户扫描了哪些端口,将全部的端口号按照一定顺序作为Flag值,提示:注意端口…

给有数据的表增加一个字段id作为主键,创建一个自增队列,将sequence队列生成的值作为id的值插入表中

1,先看原来的表是否有主键,如果有先删除 alter table crfnd.tbl_org_info drop constraint pk_tbl_org_info2,给这个表增加一个字段——id ALTER TABLE crfnd.tbl_org_info ADD id numeric(19);3,创建一个自增队列 CREATE SEOUENCE crfnd.seq_tbl_or…

编译原理手写版笔记

编译原理手写版笔记 来自smile 一个学期主要学习了词法分析、文法分析、语法分析、语义分析。 按照教学脉络,整理了一份期末笔记。用于复习整个学期的知识点 并且把所有的数据结构以及算法 整理出来。可以用于考试手写完成题目。 当然拿高分需要多练习&#xff0…

关于百万数据表全表分页查询研究

这里写自定义目录标题 前言一、背景介绍二、解决思路二、二张表的关联手法1、关联手法1 :使用JOIN2、关联手法 :使用 IN结论 前言 描述:文本主要用来记录,对大数据量表多表联合的分页查询效率的研究。 一、背景介绍 技术背景:使用若依框架…

理解 Go Mod Init

初始化Go模块和管理依赖的全面指南 go mod init 是Go编程语言(通常称为Golang)中用于初始化新Go模块的命令。在Go中,一个模块是一组相关的Go包,它们作为一个单元一起进行版本控制。通常,在项目目录的根目录下使用 go m…

【算法】运用滑动窗口方法解决算法题(C++)

文章目录 1. 滑动窗口 介绍2. 滑动窗口算法引入209.长度最小的子数组 3. 使用滑动窗口解决算法题3.无重复字符的最长子串1004.最大连续1的个数III1658.将x减到0的最小操作数904.水果成篮LCR015.找到字符串中所有字母异位词30.串联所有单词的子串76.最小覆盖子串 1. 滑动窗口 介…

数据分析-23--糖尿病预测(线性回归模型)(包含数据代码)

文章目录 0. 数据代码下载1. 项目介绍2. 数据处理1. 导入数据2. 处理数据 3. 建立模型4. 考察单个特征 0. 数据代码下载 关注公众号:『AI学习星球』 回复:糖尿病预测 即可获取数据下载。 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号或➕v&am…

“双十一、二” 业务高峰如何扛住?韵达快递选择 TDengine

小 T 导读: 为了有效处理每日亿级的数据量,早在 2021 年,韵达就选择用 TDengine 替代了 MySQL,并在三台服务器上成功部署和上线了 TDengine 2.0 集群。如今,随着 TDengine 3.0 版本的逐渐成熟,韵达决定将现…

android实战之添加图标到项目中

引言 阿里云矢量库有很多图标,注册账号,下载下载选择的图标,下载时选择svg格式。 实现 1. androidstudio ,drawable右键---new ----->vector asset,选择本地下载的资源。 点击next。完成

devops使用

官方文档 使用 Git 进行代码 - Azure DevOps | Microsoft Learn

libssh 服务端权限认证绕过(CVE-2018-10933)

漏洞描述: libssh 是一个提供 SSH 相关接口的开源库,包含服务端、客户端等。其服务端代码中存在一处逻辑错误,攻击者可以在认证成功前发送MSG_USERAUTH_SUCCESS消息,绕过认证过程,未授权访问目标 SSH 服务器。 复现过…

LeetCode——动态规划

动态规划 一、一维数组:斐波那契数列 爬楼梯70简单 dp定义: dp[i]表示爬到第i阶有多少种不同的方式 状态转移方程: dp[i] dp[i-1] dp[i-1] (每次可以爬1或2个台阶) 边界条件: dp[0] 1; dp[1] 1;&#…

易混淆的公式

a x − 1 ∼ x ln ⁡ a a^x-1\sim x\ln a ax−1∼xlna log ⁡ a ( 1 x ) ∼ x 1 ln ⁡ a \log _a(1x)\sim x\frac{1}{\ln a} loga​(1x)∼xlna1​ ( log ⁡ a x ) ′ 1 x ln ⁡ a (\log _ax) \frac{1}{x\ln a} (loga​x)′xlna1​

传统船检已经过时?AR智慧船检来助力!!

想象一下,在茫茫大海中,一艘巨型货轮正缓缓驶过。船上的工程师戴着一副先进的AR眼镜,他们不再需要反复翻阅厚重的手册,一切所需信息都实时显示在眼前。这不是科幻电影的场景,而是智慧船检技术带来的现实变革。那么问题…

[Linux]Ubuntu noVNC使用

又到了逛大型程序员交友 网站的时间了,今天你准备好了吗。 今天要推荐的一个有趣的项目是noVNC setup好以后是这个样子的,可以在浏览器登陆vnc,不需要再安装一个vnc client. setup的过程比较简单,分为以下几步: 1. v…

Linux操作系统——进程(六) 进程地址空间

进程地址空间 C/C程序员一般将我们所写的程序看成如下这种结构: 我们所写的程序通过编译编译之后就可以以这样的方式进行分布. 我们先通过编写一段C语言代码来进行验证: 运行结果: 我们可以看出来上述地址遵循的就是我们上面画的一种结构。…

059:vue中使用 AJAX来读取来自XML文件的信息

第059个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

Java系列-HTTP和HTTPS 的实现原理

HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是用于在网络上传输数据的两种协议,它们在实现原理和安全性上有一些关键的区别。 HTTP 的实现原理: 1. 无连接性&#xf…

【maven】setting.xml文件详解

Maven 的主要作用 我们使用 Maven 最主要的就是使用它的依赖管理功能。当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,那么我们就可以说 A 依赖 B。 依赖管理中要解决的具体问题: jar 包的下载:使用 Maven 之后…

mac 生成 本地.ssh

输入下面命令行 ssh-keygen 默认回车得到下面的 Generating public/private rsa key pair. Enter file in which to save the key (/Users/{用户名}/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has be…