三十三、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

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

相关推荐
AskHarries14 分钟前
工具失败时怎么办:重试、回滚、人工确认和风险提示
后端·程序员
苏三说技术2 小时前
Claude Code从失控到起飞,只用了这些技巧
后端
长栎3 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode3 小时前
Redis 在生产项目的使用
前端·后端
用户559822481223 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode3 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战3 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha3 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn3 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425913 小时前
ShardingJDBC
后端