当前位置: 首页 > news >正文

三十三、Gin的中间件

目录

定义:

一、处理请求前执行

1、模拟请求前需要鉴权

2、使用use方法

3、实验

二、处理请求后执行

1、在具体方法中添加输出方便观察整个处理请求过程生命周期

2、在next方法后增加输出即可在处理完成请求后执行内容

3、最终执行结果


定义:

在Gin框架中,中间件是用于处理请求和响应的功能模块,可以在处理请求之前或之后处理一些额外的操作

一、处理请求前执行

1、模拟请求前需要鉴权

通过获取key为session_id的值,没有获取到则为鉴权失败,返回403错误

import ("github.com/gin-gonic/gin""net/http"
)const SessionKey = "session_id"type SessionAuth struct {
}func (s *SessionAuth) Auth(ctx *gin.Context) {sessionID := ctx.GetHeader(SessionKey)if sessionID == "" {//如果没有获取到sessionID则执行终端,并返回403错误码ctx.AbortWithStatusJSON(http.StatusForbidden, "session_id is empty")}//不为空的情况下继续执行ctx.Next()
}
2、使用use方法

在此group下的请求必须先访问session的auth方法

func CmsRouter(r *gin.Engine) {session := &SessionAuth{}root := r.Group(rootPath).Use(session.Auth)//初始化cmsApp := services.NewCmsApp()//路由绑定root.GET("/hello", cmsApp.Hello)
}
3、实验

启动项目访问路径后返回

"session_id is empty"

二、处理请求后执行

1、在具体方法中添加输出方便观察整个处理请求过程生命周期
func (c *CmsApp) Hello(ctx *gin.Context) {fmt.Println("方法开始")ctx.JSON(http.StatusOK, gin.H{"message": "hello",})fmt.Println("方法结束")
}
2、在next方法后增加输出即可在处理完成请求后执行内容
import ("fmt""github.com/gin-gonic/gin""net/http"
)const SessionKey = "session_id"type SessionAuth struct {
}func (s *SessionAuth) Auth(ctx *gin.Context) {sessionID := ctx.GetHeader(SessionKey)if sessionID == "" {//如果没有获取到sessionID则执行终端,并返回403错误码ctx.AbortWithStatusJSON(http.StatusForbidden, "session_id is empty")}//不为空的情况下继续执行ctx.Next()//执行后fmt.Println("调用后执行-success")
}
3、最终执行结果

使用postman添加headers确保可以正常的请求

在控制台中可以看到

方法开始
方法结束
调用后执行-success

先正常执行了方法,最后执行了方法执行后处理逻辑 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用 ECharts 实现响应式图表:优化移动端用户体验
  • QT如何通过QTableWidget控件开发表格功能
  • 默认端口被占用后,如何修改Apache2 端口
  • Vue3 : ref 与 reactive
  • 计算机组成原理——第二章(19)
  • 基于SpringBoot的考研资讯平台设计与实现
  • 关于Python爬虫的基础知识
  • 如何实现过滤器、拦截器和全局异常捕获?
  • 使用dcm数据训练nnunet
  • FreeRTOS学习笔记(八)事件
  • echarts 3D地图
  • 可信的人类与人工智能协作:基于人类反馈和物理知识的安全自主驾驶强化学习
  • JAVA开源项目 校园管理系统 计算机毕业设计
  • python fastapi 打包exe
  • mysql笔记7(单表查询)
  • Angular Elements 及其运作原理
  • angular2 简述
  • classpath对获取配置文件的影响
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Material Design
  • Mocha测试初探
  • Terraform入门 - 1. 安装Terraform
  • Tornado学习笔记(1)
  • 搞机器学习要哪些技能
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 普通函数和构造函数的区别
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​马来语翻译中文去哪比较好?
  • !!Dom4j 学习笔记
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $refs 、$nextTic、动态组件、name的使用
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (动态规划)5. 最长回文子串 java解决
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)IOS中获取各种文件的目录路径的方法
  • ***监测系统的构建(chkrootkit )
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 连接数据库,通过数据库生成Modell